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

JVK*_*JVK 5 python postgresql sqlalchemy flask flask-sqlalchemy

我的 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
Run Code Online (Sandbox Code Playgroud)

我的模型类之一,我在其中导入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)
Run Code Online (Sandbox Code Playgroud)

我的数据库在不同模式(多租户)中具有相同的表集,并且我需要根据特定租户即时发起的请求before_request(从子域 URL 获取租户 ID)来选择模式。

我发现 Postgres 提供了使用 ref 动态选择模式名称的功能 schema_translate_maphttps://docs.sqlalchemy.org/en/14/core/connections.html#translation-of-schema-names位于execution_options https://docs.sqlalchemy.org/en/14/core/connections.html下#sqlalchemy.engine.Connection.execution_options

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

schema_translate_map但是当我创建一个对象时如何设置SQLAlchemy

我尝试过这个 -

db = SQLAlchemy(app, 
  session_options={
    "autocommit": True, 
    "autoflush": False, 
    "schema_translate_map": {
      None: "public"
    }
  }
)
Run Code Online (Sandbox Code Playgroud)

但显然,它不起作用,因为schema_translate_map如下execution_options所述https://docs.sqlalchemy.org/en/14/core/connections.html#translation-of-schema-names

任何人都有一个想法,如何schema_translate_map在创建对象时进行设置SQLAlchemy

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

我知道按照此处的建议以不同的方式执行此操作/sf/answers/3954317251/db = SQLAlchemy(app)但我的需要是仅在文件中的 某个位置进行设置app.py。然后,在导入db所有模型类(如上所示)和这些模型类中后,所有查询都会在选定的架构下执行。

JVK*_*JVK 5

我找到了一种方法来实现它。这就是所需要的

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