Mi archivo 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 Una de mis clases modelo, donde importé 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) Mi base de datos tiene el mismo conjunto de tablas en diferentes esquemas (multiinquilino) y allí necesito seleccionar el esquema según la solicitud iniciada por un inquilino en particular sobre la marcha usando before_request (tomando el id_inquilino de la URL del subdominio).
Encontré que Postgres proporciona seleccionar el nombre del esquema al vuelo usando schema_translate_map ref. https://docs.sqlalchemy.org/en/14/core/connections.html#translation-of-schema-names y que se encuentra en las opciones de execution_options https://docs.sqlalchemy.org/en/14/core/connections. html#sqlalchemy.engine.Connection.execution_options
En mi fragmento de código anterior donde ve db = SQLAlchemy(app) , según la documentación oficial, se pueden establecer dos parámetros en la creación de objetos de SQLAlchemy y son: session_options y engine_options , pero no execution_options ref. https://flask-sqlalchemy.palletsprojects.com/en/2.x/api/#flask_sqlalchemy.SQLAlchemy
Pero, ¿cómo configuro la configuración schema_translate_map cuando estoy creando un objeto de SQLAlchemy
Intenté esto -
db = SQLAlchemy(app, session_options={ "autocommit": True, "autoflush": False, "schema_translate_map": { None: "public" } } ) Pero, obviamente, no funcionó, porque schema_translate_map está bajo las opciones de execution_options como se menciona aquí https://docs.sqlalchemy.org/en/14/core/connections.html#translation-of-schema-names
Alguien tiene una idea, cómo configurar schema_translate_map al momento de crear el objeto SQLAlchemy .
Mi objetivo es configurarlo dinámicamente para cada solicitud. Quiero controlarlo desde este lugar centralizado, en lugar de ir a cada archivo de modelo y especificarlo cuando ejecuto consultas.
Soy consciente de hacer esto de manera diferente como se sugiere aquí https://stackoverflow.com/a/56490246/1560470 pero mi necesidad es configurar en algún lugar alrededor de db = SQLAlchemy(app) solo en el archivo app.py Luego, después de importar db en todas mis clases de modelo (como se muestra arriba) y en esas clases de modelo, todas las consultas se ejecutan bajo el esquema seleccionado.
Encontré una manera de lograrlo. esto es lo que necesitaba
db = SQLAlchemy(app, session_options={ "autocommit": True, "autoflush": False }, engine_options={ "execution_options": { "schema_translate_map": { None: "public", "abc": "xyz" } } } )