我正在使用Flask == 1.0.2和Flask-SQLAlchemy == 2.3.2。运行后端。
我的架构结构如下:
(其他信息:租户的数量是有限的,并且对我来说是已知的,我无需进行查询即可获取现有架构)
虽然公共架构包含每个租户使用的全局表/类,但租户架构包含特定于租户的表/类。
每个租户都具有相同的表/类。
我目前要做的是,我在每个公共类上设置架构如下:
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