天天看點

Flask-SQLAlchemy學習總結

1. 配置清單

配置鍵 說明
SQLALCHEMY_DATABASE_URI 用于連接配接資料的資料庫。例如:
  • sqlite:tmp/test.db

  • mysql://username:[email protected]/db

SQLALCHEMY_BINDS 一個映射綁定 (bind) 鍵到 SQLAlchemy 連接配接 URIs 的字典。用于綁定多個資料庫
SQLALCHEMY_ECHO 如果設定成 True,SQLAlchemy 将會記錄所有 發到标準輸出(stderr)的語句,這對調試很有幫助。
SQLALCHEMY_RECORD_QUERIES 可以用于顯式地禁用或者啟用查詢記錄。查詢記錄 在調試或者測試模式下自動啟用。更多資訊請參閱 

get_debug_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 

datetime

 對象的 時間和日期
Float 存儲浮點值
Boolean 存儲布爾值
PickleType 存儲為一個持久化的 Python 對象
LargeBinary 存儲一個任意大的二進制資料
選項名 說明
primary_key 如果設為True,表示主鍵
unique 如果設為True,這列不重複
index 如果設為True,建立索引,提升查詢效率
nullable 如果設為True,允許空值
default 為這列定義預設值,可以接受lambda表達式

3. CRUD

a. 插入記錄

向資料庫插入資料分為三個步驟:

  1. 建立 Python 對象
  2. 把它添加到會話
  3. 送出會話
>>> 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-執行降級操作, 相當于撤回本次更新操作