如何在Flask应用程序中的SQLAlchemy对象中设置schema_translate_map



我的app.py文件

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres:////tmp/test.db'
db = SQLAlchemy(app) # refer https://flask-sqlalchemy.palletsprojects.com/en/2.x/api/#flask_sqlalchemy.SQLAlchemy

我的一个模型类,我在其中导入了db

from app import db
Base = declarative_base()
# User class
class User(db.Model, Base):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
def get_user_by_id(self, id):
return self.query.get(id)

我的数据库在不同的模式(多租户(中有相同的表集我需要根据特定租户通过使用before_request(从子域URL中获取tenant_id(动态启动的请求来选择模式。

我发现Postgres提供了通过使用schema_translate_map参考。https://docs.sqlalchemy.org/en/14/core/connections.html#translation-的架构名称,并且在execution_options下https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.Connection.execution_options

在我上面的代码片段中,您可以看到db = SQLAlchemy(app),根据官方文档,在创建SQLAlchemy对象时可以设置两个参数,它们是-session_optionsengine_options,但没有execution_options参考。https://flask-sqlalchemy.palletsprojects.com/en/2.x/api/#flask_sqlalchemy.SQLAlchemy

但是当我创建SQLAlchemy的对象时,如何设置schema_translate_map设置

我试过这个-

db = SQLAlchemy(app, 
session_options={
"autocommit": True, 
"autoflush": False, 
"schema_translate_map": {
None: "public"
}
}
)

但很明显,它没有起作用,因为schema_translate_map在这里提到的execution_options之下https://docs.sqlalchemy.org/en/14/core/connections.html#translation-的架构名称

任何人都知道如何在创建SQLAlchemy对象时设置schema_translate_map

我的目标是为每个请求动态设置它。我想控制它集中的位置,而不是进入每个模型文件并在执行时指定它查询。

我知道按照这里的建议,我会采取不同的做法https://stackoverflow.com/a/56490246/1560470但我的需要是仅在CCD_ 17文件中的CCD_。然后,在我将db导入所有模型类(如上所示(和这些模型类之后,所有查询都在选定的模式下执行。

我找到了一种实现它的方法

db = SQLAlchemy(app, 
session_options={
"autocommit": True, 
"autoflush": False
},
engine_options={
"execution_options":
{
"schema_translate_map": {
None: "public",
"abc": "xyz"
}
}
}
)

最新更新