带绑定项的多数据库

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.metadataSQLAlchemy.enginesSQLAlchemy.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)