动态更改数据库SQLAlchemy实例的架构

时间:2019-07-31 10:18:21

标签: python-3.x flask flask-sqlalchemy

我有一个Flask应用程序,该应用程序在同一个MySQL数据库上使用多个架构。每个模式都有具有相同结构的相同表,并且代表应用程序用于连接到该应用程序的不同帐户的不同“实例”。

是否可以动态告诉db对象使用哪种模式?

1 个答案:

答案 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 ,则可以使用它们   完全是您惯用的方式。模型连接到指定的   数据库连接本身。

此处链接到Official Documentation