传统快速入门

警告

本指南将向您展示如何初始化扩展并定义模型,同时使用 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)

为了方便起见,扩展对象提供了对 sqlalchemysqlalchemy.orm 模块中名称的访问。因此,您可以使用 db.Column 而不用导入和使用 sqlalchemy.Column,尽管两者是等效的。

与普通的 SQLAlchemy 不同,如果未设置 __tablename__ 且定义了主键列,Flask-SQLAlchemy 的模型将自动生成表名。表名 "user" 将自动分配给模型的表。

创建表

定义模型不会在数据库中创建它。使用 create_all() 在定义模型和表后创建它们。如果你在子模块中定义模型,你必须导入它们,以便在调用 create_all 之前 SQLAlchemy 知道它们。

with app.app_context():
    db.create_all()

查询数据

你可以用相同的方式查询数据,而不管 SQLAlchemy 版本如何。有关查询的更多信息,请参阅 修改和查询数据