Flask-SQLAlchemy:具有多个PostgresSQL租户方案和公共模式的Flask DB迁移/更新

时间:2018-07-23 16:18:20

标签: python postgresql flask flask-sqlalchemy alembic

我正在使用Flask == 1.0.2和Flask-SQLAlchemy == 2.3.2。运行后端。

我的架构结构如下:

  • 公共架构
  • 租户模式1
  • Tenant-Schema 2
  • Tenant-Schema 3

(其他信息:租户的数量是有限的,并且对我来说是已知的,我无需进行查询即可获取现有架构)

虽然公共架构包含每个租户使用的全局表/类,但租户架构包含特定于租户的表/类。

每个租户都具有相同的表/类。

我目前要做的是,我在每个公共类上设置架构如下:

class User(db.Model):
    __tablename__ = 'users'
    __table_args__ = {"schema": "public"}

在承租人类上,我没有定义这样的架构。我在这里所做的是,对于每个会话/请求,我都通过以下方式设置租户架构:

@app.before_request
def beforeRequest():

    schema = request.headers.get('tenant_id')
    db.session.execute("SET search_path TO " + schema)

这真的很好,我的应用程序的行为完全符合我的要求。

现在是我的问题:

我无法通过Alembic迁移来使用此设置。当我flask db migrate进行操作时,alembic会检测到很多已添加和已删除的表,因为它想将公共表添加到我的租户模式中,反之亦然。

我现在玩了几天,换了Alembic env.py,但是我无法正常工作。

这里有人可以帮助我弄清楚吗? 如果可以轻松实现,那么我可以将模式设置为手动迁移,但是如果迁移一次完成所有模式,那当然很好。

我在env.py中尝试的方法到目前为止还没有真正起作用:

schema_to_migrate = 'tenant_1'

def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
    statement = f"SET search_path TO {schema_name}, public; {statement}"
    return statement, parameters

def include_object(object, name, type_, reflected, compare_to):
    if type_ == 'table':
        if object.schema == schema_name:
            return True
        else:
            return False
    return True

0 个答案:

没有答案