使用Flask-SQLAlchemy管理數據庫

SQLAlchemy 是一個很強大的關係型數據庫框架,處於數據庫抽象層 ,支持多種數據庫後臺。 提供了高層 ORM,也提供了使用數據庫原生 SQL 的低層功能。html

安裝Flask-SQLAlchemy

  首先,激活virtualenv虛擬環境,在虛擬環境安裝目錄的同級目錄下使用命令python

venv\Scripts\activate

命令行前出現virtualenv 則表示激活成功sql

  而後,安裝Flask-SQLAlchemyshell

pip install flask-sqlalchemy

配置SQLite數據庫

from flask.ext.sqlalchemy import SQLAlchemy

basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

db = SQLAlchemy(app)

db 對象:是 SQLAlchemy 類的實例,表示程序使用的數據庫,同時還得到了 Flask-SQLAlchemy
提供的全部功能。
SQLALCHEMY_DATABASE_URI :程序使用的數據庫 URL
SQLALCHEMY_COMMIT_ON_TEARDOWN:將其設爲 True 時,每次請求結束後都會自動提交數據庫中的變更數據庫

定義模型

在 ORM 中,模型通常是一個 Python 類,類中的屬性對應數據庫表中的列。flask

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)

    def __repr__(self):
    return '<User %r>' % self.username

__tablename__:定義在數據庫中使用的表名。若是沒有定義 tablename,Flask-SQLAlchemy 會使用一個默認名字。
其他的類變量都是該模型的屬性,被定義爲 db.Column類的實例。db.Column 類構造函數的第一個參數是數據庫列和模型屬性的類型。session

操做數據庫

建立表

讓 Flask-SQLAlchemy 根據模型類建立數據庫。方法是使用 db.create_all() 函數:app

(venv) $ python hello.py shell
>>> from hello import db
>>> db.create_all()

查看程序目錄,會發現新建了一個名爲 data.sqlite 的文件。若是數據庫表已經存在於數據庫中,那麼 db.create_all()不會從新建立或者更新這個表。若是修改模型後要把改動應用到現有的數據庫中,這一特性會帶來不便。粗暴的解決方式是先刪除再重建使用>>> db.drop_all()>>> db.create_all(),數據庫裏的數據也會被刪除。因此使用Flask-Migrate插件,這個插件對數據庫遷移框架Alembic 作了輕量級包裝,並集成到 Flask-Script 中,全部操做都經過 Flask-Script 命令完成。接下來的操做前提是安裝並使用了Flask-Migrate。
備註: 使用Flask-Migrate後,爲表新增字段後必須通過一下兩條命令才能使新模型生效框架

(venv) $ python hello.py db migrate -m "initial migration"  #自動建立遷移腳本

(venv) $ python hello.py db upgrade      #更新數據庫,且不影響其中保存的數據

函數

查詢

模型名.query.all()取對應表中的全部記錄:

>>> User.query.all()
[<User u'john'>]

可經過查看原生語句查看該表的字段

>>> str(User.query)
'SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.role_id AS users_role_id, users.password_hash AS users_password_hash, users.confirmed AS users_confirmed \nFROM users \nWHERE users.username = ?'

能夠看到模型User對應的表users中的字段有,id, email, username, role_id等

修改

先取到數據再修改而後將修改存回表中

>>> User.query.get(1)
<User u'john'>

>>> u=User.query.get(1)  #取數據

>>> print u.email
john@example.com

>>> u.email='john@qq.com'  #修改數據
>>> db.session.add(u)     #添加
>>> db.session.commit()  #提交修改
>>> User.query.get(1).email                     #查看修改後數據
u'john@qq.com'

刪除

>>> db.session.delete(u)
>>> db.session.commit()

插入行

>>> u = User(email='john@example.com', username='john', password='cat')
>>> db.session.add(u)
>>> db.session.commit()
相關文章
相關標籤/搜索