传统快速入门¶
警告
本指南将向您展示如何初始化扩展并定义模型,同时使用 SQLAlchemy 1.x 风格的 ORM 模型类。我们鼓励您升级到 SQLAlchemy 2.x,以利用新的类型化模型类。
初始化扩展¶
首先使用 SQLAlchemy
构造函数创建 db
对象。
在使用 SQLAlchemy 1.x API 时,您无需将任何参数传递给 SQLAlchemy
构造函数。声明性基类将为您在后台创建。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import DeclarativeBase
db = SQLAlchemy()
使用自定义元数据和命名约定¶
您还可以使用自定义 MetaData
对象构造 SQLAlchemy
对象。这允许您指定自定义约束 命名约定。这使约束名称保持一致且可预测,在使用迁移时非常有用,如 Alembic 所述。
from sqlalchemy import MetaData
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(metadata=MetaData(naming_convention={
"ix": 'ix_%(column_0_label)s',
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(constraint_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
}))
定义模型¶
子类化 db.Model
以定义模型类。这是一个 SQLAlchemy 声明性基类,它将采用 Column
属性并创建一个表。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String, unique=True, nullable=False)
email = db.Column(db.String)
为了方便起见,扩展对象提供了对 sqlalchemy
和 sqlalchemy.orm
模块中名称的访问。因此,您可以使用 db.Column
而不用导入和使用 sqlalchemy.Column
,尽管两者是等效的。
与普通的 SQLAlchemy 不同,如果未设置 __tablename__
且定义了主键列,Flask-SQLAlchemy 的模型将自动生成表名。表名 "user"
将自动分配给模型的表。
创建表¶
定义模型不会在数据库中创建它。使用 create_all()
在定义模型和表后创建它们。如果你在子模块中定义模型,你必须导入它们,以便在调用 create_all
之前 SQLAlchemy 知道它们。
with app.app_context():
db.create_all()
查询数据¶
你可以用相同的方式查询数据,而不管 SQLAlchemy 版本如何。有关查询的更多信息,请参阅 修改和查询数据。