我有一个Flask应用程序,该应用程序在同一个MySQL数据库上使用多个架构。每个模式都有具有相同结构的相同表,并且代表应用程序用于连接到该应用程序的不同帐户的不同“实例”。
是否可以动态告诉db对象使用哪种模式?
答案 0 :(得分:0)
为了遵循SO规则,我还将在此处粘贴有关此主题的Flask-SQLAlchemy文档的相关部分。
具有绑定的多个数据库
从0.12 Flask-SQLAlchemy开始可以 轻松连接到多个数据库。为了实现它预先配置 SQLAlchemy支持多个“绑定”。
什么是绑定?用SQLAlchemy讲绑定可以 执行SQL语句,通常是连接或引擎。在 Flask-SQLAlchemy绑定始终是为您创建的引擎 自动在幕后。这些引擎中的每一个都是 与短键(绑定键)关联。然后在 模型声明时间,以将模型与特定引擎相关联。
如果未为模型指定绑定键,则使用默认连接 代替(由SQLALCHEMY_DATABASE_URI配置)。
示例配置
以下配置声明三个 数据库连接。特殊默认值以及其他两个默认值 命名用户(针对用户)和appmeta(连接到sqlite 数据库,用于只读访问应用程序提供的某些数据 内部):
SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'
SQLALCHEMY_BINDS = {
'users': 'mysqldb://localhost/users',
'appmeta': 'sqlite:////path/to/appmeta.db'
}
创建和删除表
默认情况下,create_all()和drop_all()方法对所有声明的绑定(包括 默认一个。可以通过提供绑定来自定义此行为 参数。它需要单个绑定名称“ 全部”来引用 所有绑定或绑定列表。默认绑定 (SQLALCHEMY_DATABASE_URI)被命名为None:
>>> db.create_all()
>>> db.create_all(bind=['users'])
>>> db.create_all(bind='appmeta')
>>> db.drop_all(bind=None)
引用绑定
如果声明模型,则可以通过 bind_key 属性指定要使用的绑定:
class User(db.Model):
__bind_key__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
在内部,绑定键存储在表的信息字典中,格式为 'bind_key'。这一点很重要,因为当您要创建时 一个表对象,您必须将其放在其中:
user_favorites = db.Table('user_favorites',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('message_id', db.Integer, db.ForeignKey('message.id')),
info={'bind_key': 'users'}
)
如果您在模型上指定了 bind_key ,则可以使用它们 完全是您惯用的方式。模型连接到指定的 数据库连接本身。