如何在 Flask 应用程序的 SQLAlchemy 对象中设置 schema_translate_map
How to set schema_translate_map in SQLAlchemy object in Flask app
我的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)即时发起的请求来 select 模式。
我发现 Postgres 通过使用 select动态提供架构名称
schema_translate_map
参考。 https://docs.sqlalchemy.org/en/14/core/connections.html#translation-of-schema-names and that is under 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-of-schema-names
任何人都有想法,如何在创建 SQLAlchemy
对象时设置 schema_translate_map
。
我的目标是为每个请求动态设置它。我想从这里控制它
集中的地方,而不是进入每个模型文件并在我执行时指定它
查询。
我知道按照此处的建议以不同方式执行此操作
但我的需要是仅在 app.py
文件中的 db = SQLAlchemy(app)
附近设置。然后在我的所有模型 类(如上所示)和那些模型 类 中导入 db
之后,所有查询都在 selected 模式下执行。
我找到了实现它的方法。这就是需要的
db = SQLAlchemy(app,
session_options={
"autocommit": True,
"autoflush": False
},
engine_options={
"execution_options":
{
"schema_translate_map": {
None: "public",
"abc": "xyz"
}
}
}
)
我的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)即时发起的请求来 select 模式。
我发现 Postgres 通过使用 select动态提供架构名称
schema_translate_map
参考。 https://docs.sqlalchemy.org/en/14/core/connections.html#translation-of-schema-names and that is under 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-of-schema-names
任何人都有想法,如何在创建 SQLAlchemy
对象时设置 schema_translate_map
。
我的目标是为每个请求动态设置它。我想从这里控制它 集中的地方,而不是进入每个模型文件并在我执行时指定它 查询。
我知道按照此处的建议以不同方式执行此操作
但我的需要是仅在 app.py
文件中的 db = SQLAlchemy(app)
附近设置。然后在我的所有模型 类(如上所示)和那些模型 类 中导入 db
之后,所有查询都在 selected 模式下执行。
我找到了实现它的方法。这就是需要的
db = SQLAlchemy(app,
session_options={
"autocommit": True,
"autoflush": False
},
engine_options={
"execution_options":
{
"schema_translate_map": {
None: "public",
"abc": "xyz"
}
}
}
)