我的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_options
和engine_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"
}
}
}
)