Flask-Sqlalchemy动态绑定

时间:2019-05-25 08:08:54

标签: python sqlite flask sqlalchemy flask-sqlalchemy

我有以下config.py:

SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///' + os.path.join(basedir, 'master.db')
SQLALCHEMY_BINDS = {
    'project0':        'sqlite:///' + os.path.join(basedir, 'project0.db')
    'project1':        'sqlite:///' + os.path.join(basedir, 'project1.db')
    'project2':        'sqlite:///' + os.path.join(basedir, 'project2.db')

    }

我需要我的用户在登录时选择项目数据库之一。我想将此选择存储在某个变量中,并将其传递给模型类。

class Punchlist(db.Model,choice):
    __bind_key__ = choice

该db对象将使用__init.py中的默认db初始化:

app.config.from_object(Config)
db = SQLAlchemy(app)

哪种方法可以将此选择与用户相关联?

1 个答案:

答案 0 :(得分:0)

您可以创建一个包含 bind_key 变量的基类。例如:

class Base(db.Model):
    __abstract__ = True

    def __init__(self, **kwargs):
        self.bind_key = kwargs.pop('bind_key') if kwargs.get('bind_key') else 'project0'
        db.Model.metadata.tables[self.__tablename__].info['bind_key'] = self.bind_key
        super(Base, self).__init__(**kwargs)

派生类

class PunchList(Base):
   __tablename__ = 'Punchlist'

初始化 PunchList 类

punch_list_0 = PunchList()
punch_list_1 = PunchList(bind_key='project1')
punch_list_2 = PunchList(bind_key='project2')