Flask-SQLAlchemy使用
Flask-SQLAlchemy 使用起來非常有趣,對於基本應用十分容易使用,並且對於大型項目易於擴展。
官方文檔://flask-sqlalchemy.palletsprojects.com/en/2.x/
中文文檔://www.pythondoc.com/flask-sqlalchemy/
安裝
pip install flask-sqlalchemy
配置
配置選項 | 說明 |
---|---|
SQLALCHEMY_DATABASE_URI |
連接資料庫。示例:mysql://username:password@host/post/db?charset=utf-8 |
SQLALCHEMY_BINDS |
一個將會綁定多種資料庫的字典。 更多詳細資訊請看官文 綁定多種資料庫. |
SQLALCHEMY_ECHO |
調試設置為true |
SQLALCHEMY_POOL_SIZE |
資料庫池的大小,默認值為5。 |
SQLALCHEMY_POOL_TIMEOUT |
連接超時時間 |
SQLALCHEMY_POOL_RECYCLE |
自動回收連接的秒數。 |
SQLALCHEMY_MAX_OVERFLOW |
控制在連接池達到最大值後可以創建的連接數。當這些額外的連接回收到連接池後將會被斷開和拋棄。 |
SQLALCHEMY_TRACK_MODIFICATIONS |
如果設置成 True (默認情況),Flask-SQLAlchemy 將會追蹤對象的修改並且發送訊號。這需要額外的記憶體, 如果不必要的可以禁用它。 |
創建及查詢
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class User(db.Model):
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
if __name__ == '__main__':
# 創建初始數據
db.create_all()
# 創建一些用戶
admin = User('admin', '[email protected]')
guest = User('guest', '[email protected]')
# 寫入到資料庫
db.session.add(admin)
db.session.add(guest)
db.session.commit()
# 訪問資料庫
users = User.query.all()
admin = User.query.filter_by(username='admin').first()
print(users)
print(admin)
結果:
[<User 'admin'>, <User 'guest'>]
<User 'admin'>
表關聯
SQLAlchemy 連接到關係型資料庫,關係型數據最擅長的東西就是關聯。因此,我們將創建一個使用兩張相互關聯的表的應用作為例子:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), nullable=False)
body = db.Column(db.Text, nullable=False)
pub_date = db.Column(db.DateTime, nullable=False,
default=datetime.utcnow)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'), # 外鍵
nullable=False)
# 與生成表結構無關,僅用於查詢方便
# backref 標示可通過relationship反向查找,Category.posts查詢Post表數據
category = db.relationship('Category',
backref=db.backref('posts', lazy=True))
def __repr__(self):
return '<Post %r>' % self.title
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
def __repr__(self):
return '<Category %r>' % self.name
if __name__ == '__main__':
# 創建一些對象
py = Category(name='Python')
Post(title='Hello Python!', body='Python is pretty cool', category=py)
p = Post(title='Snakes', body='Ssssssss')
py.posts.append(p)
db.session.add(py)
# 現在因為我們在 backref 中聲明了 posts 作為動態關係,查詢顯示為:
print(py.posts)
運行結果:
[<Post 'Hello Python!'>, <Post 'Snakes'>]
更多資料庫的增刪改查等功能參考官方文檔://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/