如何在 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_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_mapexecution_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"
        }
      }
  }
)