带绑定项的多数据库¶
SQLAlchemy 一次可以连接到多个数据库。它将不同的引擎称为“绑定项”。Flask-SQLAlchemy 通过将每个引擎与一个短字符串(“绑定键”)关联,然后将每个模型和表与一个绑定键关联,从而简化了绑定项的工作方式。会话将根据被查询对象的绑定键选择用于查询的引擎。如果没有给出绑定键,则使用默认引擎。
配置绑定项¶
默认绑定项仍然通过设置 SQLALCHEMY_DATABASE_URI
来配置,以及 SQLALCHEMY_ENGINE_OPTIONS
用于任何引擎选项。其他绑定项在 SQLALCHEMY_BINDS
中给出,这是一个将绑定键映射到引擎 URL 的字典。要为绑定项指定引擎选项,该值可以是带有 "url"
键的引擎选项字典,而不是仅一个 URL 字符串。
SQLALCHEMY_DATABASE_URI = "postgresql:///main"
SQLALCHEMY_BINDS = {
"meta": "sqlite:////path/to/meta.db",
"auth": {
"url": "mysql://127.0.0.1/users",
"pool_recycle": 3600,
},
}
定义带绑定项的模型和表¶
Flask-SQLAlchemy 将为每个配置的绑定项创建一个元数据和引擎。带有绑定键的模型和表将使用相应的元数据进行注册,会话将使用相应的引擎对其进行查询。
要为模型设置绑定项,请设置 __bind_key__
类属性。不设置绑定键等效于将其设置为 None
,这是默认键。
class User(db.Model):
__bind_key__ = "auth"
id = db.Column(db.Integer, primary_key=True)
从该模型继承的模型将共享相同的绑定键,或可以覆盖它。
要为表设置绑定项,请传递 bind_key
关键字参数。
user_table = db.Table(
"user",
db.Column("id", db.Integer, primary_key=True),
bind_key="auth",
)
最终,会话在与模型或表关联的元数据上查找绑定键。该关联在创建期间发生。因此,在创建模型或表后更改绑定键将不起作用。
访问元数据和引擎¶
您可能需要检查绑定元数据或引擎。请注意,您应通过会话执行查询,而不是直接在引擎上执行。
默认引擎为 SQLAlchemy.engine
,默认元数据为 SQLAlchemy.metadata
。 SQLAlchemy.engines
和 SQLAlchemy.metadatas
是映射所有绑定键的字典。
创建和删除表¶
默认情况下,create_all()
和 drop_all()
方法对所有绑定进行操作。这些方法的 bind_key
参数可以是字符串或 None
,以对单个绑定进行操作,也可以是字符串或 None
的列表,以对绑定子集进行操作。由于这些方法访问引擎,因此必须在应用程序上下文中调用它们。
# create tables for all binds
db.create_all()
# create tables for the default and "auth" binds
db.create_all(bind_key=[None, "auth"])
# create tables for the "meta" bind
db.create_all(bind_key="meta")
# drop tables for the default bind
db.drop_all(bind_key=None)