1. 配置清單
配置鍵 | 說明 |
SQLALCHEMY_DATABASE_URI | 用于連接配接資料的資料庫。例如:
|
SQLALCHEMY_BINDS | 一個映射綁定 (bind) 鍵到 SQLAlchemy 連接配接 URIs 的字典。用于綁定多個資料庫 |
SQLALCHEMY_ECHO | 如果設定成 True,SQLAlchemy 将會記錄所有 發到标準輸出(stderr)的語句,這對調試很有幫助。 |
SQLALCHEMY_RECORD_QUERIES | 可以用于顯式地禁用或者啟用查詢記錄。查詢記錄 在調試或者測試模式下自動啟用。更多資訊請參閱 。 |
SQLALCHEMY_NATIVE_UNICODE | 可以用于顯式地禁用支援原生的 unicode。這是 某些資料庫擴充卡必須的(像在 Ubuntu 某些版本上的 PostgreSQL),當使用不合适的指定無編碼的資料庫 預設值時。 |
SQLALCHEMY_POOL_SIZE | 資料庫連接配接池的大小。預設是資料庫引擎的預設值 (通常是 5)。 |
SQLALCHEMY_POOL_TIMEOUT | 指定資料庫連接配接池的逾時時間。預設是 10。 |
SQLALCHEMY_POOL_RECYCLE | 自動回收連接配接的秒數。這對 MySQL 是必須的,預設 情況下 MySQL 會自動移除閑置 8 小時或者以上的連接配接。 需要注意地是如果使用 MySQL 的話, Flask-SQLAlchemy 會自動地設定這個值為 2 小時。 |
SQLALCHEMY_MAX_OVERFLOW | 控制在連接配接池達到最大值後可以建立的連接配接數。當這些額外的 連接配接回收到連接配接池後将會被斷開和抛棄。 |
SQLALCHEMY_TRACK_MODIFICATIONS | 如果設定成 True (預設情況),Flask-SQLAlchemy 将會追蹤對象的修改并且發送信号。這需要額外的記憶體, 如果不必要的可以禁用它。 |
Flask項目中,一般使用單獨的檔案存儲配置(如:config.py),應用程式可以使用from_object()來擷取配置資訊
2. 聲明模型
db = SQLAlchemy()
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r>' % self.username
列類型 | 說明 |
Integer | 一個整數 |
String (size) | 有長度限制的字元串 |
Text | 一些較長的 unicode 文本 |
DateTime | 表示為 Python 對象的 時間和日期 |
Float | 存儲浮點值 |
Boolean | 存儲布爾值 |
PickleType | 存儲為一個持久化的 Python 對象 |
LargeBinary | 存儲一個任意大的二進制資料 |
選項名 | 說明 |
primary_key | 如果設為True,表示主鍵 |
unique | 如果設為True,這列不重複 |
index | 如果設為True,建立索引,提升查詢效率 |
nullable | 如果設為True,允許空值 |
default | 為這列定義預設值,可以接受lambda表達式 |
3. CRUD
a. 插入記錄
向資料庫插入資料分為三個步驟:
- 建立 Python 對象
- 把它添加到會話
- 送出會話
>>> from yourapp import User
>>> me = User('admin', '[email protected]')
>>> db.session.add(me)
>>> db.session.commit()
b. 删除記錄
>>> db.session.delete(me)
>>> db.session.commit()
c. 查詢記錄 Flask-SQLAlchemy 在您的 Model 類上提供了 query 屬性。當您通路它時,您會得到一個新的所有記錄的查詢對象。
>>> peter = User.query.filter_by(username='peter').first()
>>> peter.id
1
>>> peter.email
u'[email protected]'
SQLAlchemy有查詢過濾器如下:
過濾器 | 說明 |
filter() | 把過濾器添加到原查詢,傳回新查詢 |
filter_by() | 把等值過濾器添加到原查詢,傳回新查詢 |
limit() | 使用指定值限制原查詢傳回的結果數量,傳回新查詢 |
offset() | 偏移原查詢傳回的結果,傳回新查詢 |
order_by() | 排序傳回結果,傳回新查詢 |
groupby() | 原查詢分組,傳回新查詢 |
這些過濾器傳回的結果都是一個新查詢,這些查詢其實是生成的SQL語句,惰性求值方式也展現在查詢上,而這些語句不能生成需要查詢的對象,需要調用其他的方法生成對象。 SQL查詢執行函數:
方法 | 說明 |
all() | 以清單形式傳回結果 |
first() | 傳回第一個結果,如果沒有傳回None |
first_or_404() | 傳回第一個結果,如果沒有抛出404異常 |
get() | 傳回主鍵對應記錄,沒有則傳回None |
get_or_404() | 傳回主鍵對應記錄,如果沒有抛出404異常 |
count() | 傳回查詢結果數量 |
paginate() | 傳回paginate對象,此對象用于分頁 |
4.綁定多個資料庫
下面的配置聲明了三個資料庫連接配接。特殊的預設值和另外兩個分别名為 users`(用于使用者)和 `appmeta 連接配接到一個提供隻讀通路應用内部資料的 sqlite 資料庫):
SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'
SQLALCHEMY_BINDS = {
'users': 'mysqldb://localhost/users',
'appmeta': 'sqlite:path/to/appmeta.db'
}
create_all() 和 drop_all() 方法預設作用于所有聲明的綁定(bind),包括預設的。這個行為可以通過提供 bind 參數來定制。
>>> db.create_all()
>>> db.create_all(bind=['users'])
>>> db.create_all(bind='appmeta')
>>> db.drop_all(bind=None)
當您聲明模型時,您可以用 __bind_key__ 屬性指定綁定(bind):
class User(db.Model):
__bind_key__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
如果您在模型上指定了 __bind_key__ ,您可以用它們準确地做您想要的。模型會自行連 接到指定的資料庫連接配接。
5. 資料遷移
建立管理檔案manage.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand
db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object(config[config_name])
db.init_app(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
manager.run()
manager使用說明:
指令格式: python manager.py db [command]
command說明: init-初始化資料庫遷移(自動生成migrations目錄及檔案),僅在第一次使用 migrate-生成遷移資料,自動根據model變化生成遷移資料檔案,含版本控制 upgrade-執行更新操作,将變動的表結構送出到資料庫,保留資料庫原資料 downgrade-執行降級操作, 相當于撤回本次更新操作