安装

(venv) $ pip install flask-sqlalchemy

基础用法

官方文档 的入门示例代码如下,SQLAlchemy 对象和模型均写在 flask 的入口文件中。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database/cart.db'
app.config.setdefault('SQLALCHEMY_TRACK_MODIFICATIONS', True)
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

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

注意:sqlite 数据库文件要提前创建好,路径中三个斜线 sqlite:/// 代表相对路径,四个斜线 sqlite://// 代表绝对路径。

使用独立的模型文件

实际开发项目时通常会把模型文件放在单独的文件中,可以在项目目录创建 model 文件夹专门用来存放模型文件,例如将基础用法中的 User 模型拆分到 model/user.py 文件中。

app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database/cart.db'
app.config.setdefault('SQLALCHEMY_TRACK_MODIFICATIONS', True)
db = SQLAlchemy(app)
...

model/user.py

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

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

生成和删除数据表

模型定义好以后,就可以进入 python shell 中生成相应的数据表。由于已经将模型和应用分离,因此需要单独从模型文件导入 db 后创建模型对应的数据表,如下所示从 user 模型中导入 dbUser,执行 db.create_all() 会依照模型中的定义在数据库中生成相应的数据表。

生成数据表

>>> from model.user import db, User
>>> db.create_all()
>>> User
<class 'model.user.User'>
>>> User.query.all()
[]

删除数据表

>>> from model.user import db
>>> db.drop_all()

CRUD 操作

// 插入
>>> from model.user import db, User
>>> admin = User(username='admin', email='admin@email.com')
>>> guest = User(username='guest', email='guest@email.com')
>>> db.session.add(admin)
>>> db.session.add(guest)
>>> db.session.commit()

// 查询
>>> User.query.all()
[<User 'admin'>, <User 'guest'>]
>>> User.query.first()
<User 'admin'>
>>> admin.email
'admin@email.com'

// 更新
>>> guest = User.query.filter_by(username='guest').first()
>>> guest
<User 'guest'>
>>> guest.username
'guest'
>>> guest.username = 'test'
>>> db.session.add(guest)
>>> db.session.commit()
>>> User.query.all()
[<User 'test'>]

// 删除
>>> admin = User.query.filter_by(username='admin').first()
>>> db.session.delete(admin)
>>> User.query.all()
[<User 'guest'>]