API¶
扩展¶
- class flask_sqlalchemy.SQLAlchemy(app=None, *, metadata=None, session_options=None, query_class=<class 'flask_sqlalchemy.query.Query'>, model_class=<class 'flask_sqlalchemy.model.Model'>, engine_options=None, add_models_to_shell=True, disable_autonaming=False)¶
将 SQLAlchemy 与 Flask 集成。这负责设置一个或多个引擎,将表和模型与特定引擎关联,并在每次请求后清理连接和会话。
只有引擎配置是特定于每个应用程序的,其他内容(如模型、表、元数据和会话)对于使用该扩展实例的所有应用程序都是共享的。调用
init_app()
以在应用程序上配置扩展。创建扩展后,通过继承
Model
创建模型类,并通过Table
创建表类。可以在调用init_app()
之前访问这些类,从而可以将模型与应用程序分开定义。访问
session
和engine
需要一个活动的 Flask 应用程序上下文。这包括使用引擎的方法,例如create_all()
。此类还提供对 SQLAlchemy 中
sqlalchemy
和sqlalchemy.orm
模块的名称的访问。例如,你可以使用db.Column
和db.relationship
而不是导入sqlalchemy.Column
和sqlalchemy.orm.relationship
。在定义模型时,这会很方便。- 参数:
app (Flask | None) – 立即在此 Flask 应用程序上调用
init_app()
。metadata (sa.MetaData | None) – 将此用作默认
sqlalchemy.schema.MetaData
。对于设置命名约定很有用。session_options (dict[str, t.Any] | None) –
session
用于创建每个会话实例的参数。一个scopefunc
键将传递给范围会话,而不是会话实例。有关参数列表,请参阅sqlalchemy.orm.sessionmaker
。query_class (type[Query]) – 将此用作模型和动态关系的默认查询类。在 SQLAlchemy 中,查询接口被认为是过时的。
model_class (_FSA_MCT) – 在创建声明模型类
Model
时,将此用作模型基类。对于进一步的自定义,它也可以是一个完全创建的声明模型类。engine_options (dict[str, t.Any] | None) – 创建每个引擎时使用的默认参数。这些优先级低于应用程序配置。有关参数列表,请参阅
sqlalchemy.create_engine()
。add_models_to_shell (bool) – 将
db
实例和所有模型类添加到flask shell
。disable_autonaming (bool) –
在 3.1.0 版本中更改:
metadata
参数仍然可以与 SQLAlchemy 1.x 类一起使用,但在使用 SQLAlchemy 2.x 声明类样式时将被忽略。相反,在 Base 类上指定元数据。在 3.1.0 版本中更改: 添加了
disable_autonaming
参数。在 3.1.0 版本中更改: 将
model_class
参数更改为接受 SQLAlchemy 2.x 声明基本子类。在 3.0 版本中更改: 始终需要一个活动的 Flask 应用程序上下文才能访问
session
和engine
。在 3.0 版本中更改: 每个绑定键都使用单独的
metadata
。在 3.0 版本中更改:
engine_options
参数在引擎前配置之前作为默认值应用。在 3.0 版本中更改: 会话类可以在
session_options
中进行自定义。在 3.0 版本中更改: 添加了
add_models_to_shell
参数。在 3.0 版本中更改: 在调用
init_app
时创建引擎,而不是在首次访问它们时创建。在 3.0 版本中更改: 除了
app
之外的所有参数都是关键字限定的。在 3.0 版本中更改: 扩展实例直接存储为
app.extensions["sqlalchemy"]
。在 3.0 版本中更改: 设置方法使用前导下划线重命名。它们被视为可能随时更改的内部接口。
在 3.0 版本中更改: 删除了
use_native_unicode
参数和配置。在版本 2.4 中更改: 添加了
engine_options
参数。在版本 2.1 中更改: 添加了
metadata
、query_class
和model_class
参数。在版本 2.1 中更改: 在
session
、Model.query
和Query
中使用相同的查询类。在版本 0.16 中更改:
scopefunc
在session_options
中被接受。在版本 0.10 中更改: 添加了
session_options
参数。- Model¶
一个 SQLAlchemy 声明模型类。子类化此类以定义数据库模型。
如果一个模型没有设置
__tablename__
,它将通过将类名从CamelCase
转换为snake_case
来生成。如果模型看起来像使用单表继承,它将不会被生成。如果一个模型或父类设置
__bind_key__
,它将使用该元数据和数据库引擎。否则,它将使用默认的metadata
和engine
。如果模型设置metadata
或__table__
,则忽略此设置。对于使用 SQLAlchemy 1.x API 的代码,通过子类化
Model
并将model_class
参数传递给扩展来定制此模型。一个完全创建的声明模型类也可以被传递,以使用自定义元类。对于使用 SQLAlchemy 2.x API 的代码,通过子类化
sqlalchemy.orm.DeclarativeBase
或sqlalchemy.orm.DeclarativeBaseNoMeta
并将model_class
参数传递给扩展来定制此模型。
- Query¶
由
Model.query
和lazy="dynamic"
关系使用的默认查询类。警告
查询界面在 SQLAlchemy 中被视为传统。
通过将
query_class
参数传递给扩展来定制它。
- Table¶
一个
sqlalchemy.schema.Table
类,它会自动选择元数据。与基本
Table
不同,metadata
参数不是必需的。如果没有给出,则根据bind_key
参数进行选择。- 参数:
bind_key – 用于选择不同的元数据。
args – 传递给基类的参数。这些通常是表的名称、列和约束。
kwargs – 传递给基类的参数。
在 3.0 版中更改:这是 SQLAlchemy 的
Table
的子类,而不是一个函数。
- create_all(bind_key='__all__')¶
通过为所有或部分绑定键调用
metadata.create_all()
来创建数据库中不存在的表。这不会更新现有表,请为此使用迁移库。这需要激活 Flask 应用程序上下文。
在版本 3.0 中更改: 将
bind
参数重命名为bind_key
。删除了app
参数。在版本 0.12 中更改: 添加了
bind
和app
参数。
- drop_all(bind_key='__all__')¶
通过为所有或某些绑定键调用
metadata.drop_all()
来删除表。这需要激活 Flask 应用程序上下文。
在版本 3.0 中更改: 将
bind
参数重命名为bind_key
。删除了app
参数。在版本 0.12 中更改: 添加了
bind
和app
参数。
- dynamic_loader(argument, **kwargs)¶
一个
sqlalchemy.orm.dynamic_loader()
,它将此扩展的Query
类应用于关系和反向引用。在版本 3.0 中更改:
Query
类设置在backref
中。- 参数:
- 返回类型:
- 属性 引擎: 引擎¶
当前应用程序的默认
引擎
,如果会话
被模型
或表
查询时未设置绑定键,则使用此引擎。要自定义,请设置
SQLALCHEMY_ENGINE_OPTIONS
配置,并通过将engine_options
参数传递给扩展来设置默认值。这需要激活 Flask 应用程序上下文。
- 属性 引擎: 映射[字符串 | 无, 引擎]¶
当前应用程序的绑定键到
sqlalchemy.engine.Engine
实例的映射。无
键引用默认引擎,并可用作引擎
。要自定义,请设置
SQLALCHEMY_BINDS
配置,并通过将engine_options
参数传递给扩展来设置默认值。这需要激活 Flask 应用程序上下文。
版本 3.0 中的新增内容。
- first_or_404(statement, *, description=None)¶
类似于
Result.scalar()
,但会中止并显示404 Not Found
错误,而不是返回None
。版本 3.0 中的新增内容。
- get_engine(bind_key=None, **kwargs)¶
获取当前应用程序给定绑定键的引擎。这需要激活 Flask 应用程序上下文。
自版本 3.0 起弃用:将在 Flask-SQLAlchemy 3.2 中移除。请改用
engines[key]
。在版本 3.0 中更改: 将
bind
参数重命名为bind_key
。删除了app
参数。
- get_or_404(entity, ident, *, description=None, **kwargs)¶
类似于
session.get()
,但会中止并显示404 Not Found
错误,而不是返回None
。- 参数:
- 返回类型:
_O
在版本 3.1 中更改: 将额外的关键字参数传递给
session.get()
。版本 3.0 中的新增内容。
- init_app(app)¶
使用此扩展实例初始化 Flask 应用程序。在使用应用程序访问数据库引擎或会话之前,必须调用此方法。
这会设置默认配置值,然后在应用程序上配置扩展并为每个绑定键创建引擎。因此,必须在应用程序配置之后调用此方法。此调用之后对应用程序配置的更改不会反映出来。
使用
app.config
中的以下键- 参数:
app (Flask) – 要初始化的 Flask 应用程序。
- 返回类型:
无
- metadatas: dict[str | None, MetaData]¶
将绑定键映射到
sqlalchemy.schema.MetaData
实例。None
键引用默认元数据,并作为metadata
提供。通过将
metadata
参数传递给扩展来定制默认元数据。这可用于设置命名约定。当为另一个绑定键创建元数据时,它会复制默认的命名约定。版本 3.0 中的新增内容。
- one_or_404(statement, *, description=None)¶
类似于
Result.scalar_one()
,但会中止,并显示404 Not Found
错误,而不是引发NoResultFound
或MultipleResultsFound
。版本 3.0 中的新增内容。
- paginate(select, *, page=None, per_page=None, max_per_page=None, error_out=True, count=True)¶
根据当前页和每页项目数对选择语句应用偏移和限制,返回一个
Pagination
对象。该语句应选择一个模型类,如
select(User)
。这会对结果应用unique()
和scalars()
修饰符,因此复合选择不会返回预期结果。- 参数:
select (Select) – 要分页的
select
语句。page (int | None) – 当前页,用于计算偏移。在请求期间默认为
page
查询参数,否则为 1。per_page (int | None) – 一页上的最大项目数,用于计算偏移和限制。在请求期间默认为
per_page
查询参数,否则为 20。max_per_page (int | None) –
per_page
的最大允许值,用于限制用户提供的值。对于没有限制,使用None
。默认为 100。error_out (bool) – 如果没有返回任何项目且
page
不为 1,或者如果page
或per_page
小于 1,或者如果它们都不是整数,则中止并显示404 Not Found
错误。count (bool) – 通过发出额外的计数查询来计算值的总数。对于非常复杂的查询,这可能不准确或速度较慢,因此可以禁用它并在必要时手动设置。
- 返回类型:
在版本 3.0 中已更改:
count
查询更高效。版本 3.0 中的新增内容。
- reflect(bind_key='__all__')¶
通过对所有或部分绑定键调用
metadata.reflect()
来从数据库加载表定义。这需要激活 Flask 应用程序上下文。
在版本 3.0 中更改: 将
bind
参数重命名为bind_key
。删除了app
参数。在版本 0.12 中更改: 添加了
bind
和app
参数。
- relationship(*args, **kwargs)¶
一个
sqlalchemy.orm.relationship()
,它应用此扩展的Query
类,用于动态关系和反向引用。在版本 3.0 中更改:
Query
类设置在backref
中。- 参数:
- 返回类型:
- session¶
一个
sqlalchemy.orm.scoping.scoped_session
,用于创建Session
的实例,该实例的作用域限定为当前 Flask 应用程序上下文。当应用程序上下文退出时,将移除会话,并将引擎连接返回到池中。通过将
session_options
传递给扩展来对其进行自定义。这需要激活 Flask 应用程序上下文。
在版本 3.0 中更改:会话的作用域限定为当前应用程序上下文。
Model¶
- class flask_sqlalchemy.model.Model¶
声明模型类
SQLAlchemy.Model
的基类。要定义模型,请将
db.Model
子类化,而不是这个。要自定义db.Model
,请将其子类化并将其作为model_class
传递给SQLAlchemy
。要在元类级别自定义db.Model
,请将已创建的声明模型类作为model_class
传递。- __bind_key__¶
使用此绑定键来选择要与此模型的表关联的元数据和引擎。如果设置了
metadata
或__table__
,则忽略此设置。如果没有给出,则使用默认键None
。
- __tablename__¶
数据库中的表名。这是 SQLAlchemy 所需的;但是,如果模型定义了主键,Flask-SQLAlchemy 将自动设置它。如果
__table__
或__tablename__
显式设置,则将使用它们。
- query: t.ClassVar[Query]¶
模型的 SQLAlchemy 查询。等效于
db.session.query(Model)
。可以通过覆盖query_class
来针对每个模型进行自定义。警告
查询界面在 SQLAlchemy 中被认为是过时的。最好使用
session.execute(select())
。
- query_class¶
由
query
使用的查询类。默认为SQLAlchemy.Query
,它默认为Query
。Query
的别名
元类 mixin(SQLAlchemy 1.x)¶
如果你的代码使用 SQLAlchemy 1.x API(未指定 model_class
的代码的默认值),则这些 mixin 将自动应用于 Model
类。
- 类 flask_sqlalchemy.model.DefaultMeta(名称, 基础, d, **kwargs)¶
提供
__bind_key__
和__tablename__
支持的 SQLAlchemy 声明元类。
- 类 flask_sqlalchemy.model.BindMetaMixin(名称, 基础, d, **kwargs)¶
基于其
__bind_key__
设置模型的metadata
的元类 mixin。如果模型直接设置
metadata
或__table__
,则忽略__bind_key__
。如果metadata
与父模型相同,则不会直接在子模型上设置它。
会话¶
- 类 flask_sqlalchemy.session.会话(db, **kwargs)¶
SQLAlchemy
会话
类,根据与要查询的事物关联的元数据关联的绑定键选择要使用的引擎。要自定义
db.session
,请对其进行子类化,并将其作为class_
键传递给SQLAlchemy
中的session_options
。3.0 版中已更改: 已从
SignallingSession
重命名。- 参数:
db (SQLAlchemy) –
kwargs (t.Any) –
分页¶
- class flask_sqlalchemy.pagination.Pagination¶
查询中所有项的切片,通过基于当前页和每页项数应用偏移量和限制获得。
不要手动创建分页对象。它们由
SQLAlchemy.paginate()
和Query.paginate()
创建。版本 3.0 中更改:迭代分页对象会迭代其项。
版本 3.0 中更改:手动创建实例不是公开 API。
- prev(*, error_out=False)¶
查询
Pagination
对象的上一页。
- next(*, error_out=False)¶
查询
Pagination
对象的下一页。
- iter_pages(*, left_edge=2, left_current=2, right_current=4, right_edge=2)¶
为分页小部件生成页码。边缘和中间之间的跳过页由
None
表示。例如,如果有 20 页,当前页为 7,则生成以下值。
1, 2, None, 5, 6, 7, 8, 9, 10, 11, None, 19, 20
- 参数:
- 返回类型:
3.0 版中已更改: 提高了计算生成内容的效率。
3.0 版中更改:
right_current
边界包含在内。3.0 版中更改:所有参数都是关键字专用。
查询¶
- class flask_sqlalchemy.query.Query(entities, session=None)¶
SQLAlchemy
Query
子类,其中包含一些在 Web 应用程序中进行查询时有用的额外方法。这是
Model.query
的默认查询类。3.0 版中更改:从
BaseQuery
重命名为Query
。- 参数:
entities (Union[_ColumnsClauseArgument[Any], Sequence[_ColumnsClauseArgument[Any]]]) –
session (Optional[Session]) –
- one_or_404(description=None)¶
类似于
one()
,但会中止并显示404 Not Found
错误,而不是引发NoResultFound
或MultipleResultsFound
。版本 3.0 中的新增内容。
- paginate(*, page=None, per_page=None, max_per_page=None, error_out=True, count=True)¶
根据当前页和每页的项目数应用偏移量和限制,返回一个
Pagination
对象。- 参数:
page (int | None) – 当前页,用于计算偏移。在请求期间默认为
page
查询参数,否则为 1。per_page (int | None) – 一页上的最大项目数,用于计算偏移和限制。在请求期间默认为
per_page
查询参数,否则为 20。max_per_page (int | None) –
per_page
的最大允许值,用于限制用户提供的值。对于没有限制,使用None
。默认为 100。error_out (bool) – 如果没有返回任何项目且
page
不为 1,或者如果page
或per_page
小于 1,或者如果它们都不是整数,则中止并显示404 Not Found
错误。count (bool) – 通过发出额外的计数查询来计算值的总数。对于非常复杂的查询,这可能不准确或速度较慢,因此可以禁用它并在必要时手动设置。
- 返回类型:
3.0 版中更改:所有参数都是关键字专用。
在版本 3.0 中已更改:
count
查询更高效。3.0 版中已更改:
max_per_page
默认为 100。
记录查询¶
- flask_sqlalchemy.record_queries.get_recorded_queries()¶
获取当前会话的已记录查询信息列表。如果启用了配置
SQLALCHEMY_RECORD_QUERIES
,则记录查询。每个查询信息对象具有以下属性
statement
SQLAlchemy 生成的 SQL 字符串,其中包含参数占位符。
parameters
随 SQL 语句一起发送的参数。
start_time
/end_time
有关查询何时开始执行以及何时返回结果的时间信息。准确性和值取决于操作系统。
duration
查询花费的时间(以秒为单位)。
location
有关查询在应用程序代码中何处执行的字符串描述。这可能无法计算,并且格式不稳定。
3.0 版中已更改: 已从
get_debug_queries
重命名。3.0 版中已更改: 信息对象是一个数据类,而不是元组。
3.0 版中已更改: 信息对象属性
context
已重命名为location
。3.0 版中已更改: 不会在调试或测试模式下自动启用。
- 返回类型:
list[_QueryInfo]
跟踪修改¶
- flask_sqlalchemy.track_modifications.models_committed¶
如果会话中有更改的模型,则在会话提交后发送此 Blinker 信号。
发送方是发出更改的应用程序。接收方会收到
changes
参数,其中包含形式为(instance, operation)
的元组列表。操作包括"insert"
、"update"
和"delete"
。
- flask_sqlalchemy.track_modifications.before_models_committed¶
此信号的工作方式与
models_committed
完全相同,但会在提交发生之前发出。