SQLAlchemy предоставляет Connection.execution_options.schema_translate_map
для изменения схем во время выполнения, как сказано в .Flask-SQLAlchemy как использовать create_all с schema_translate_map
В примерах показано, как использовать для выполнения запросов, но вы хотите знать, как использовать его с create_all().
Я использую Flask-Sqlaclhemy и postgresql как базу данных. Скажем, у меня есть это:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
app = Flask(...)
...
db.init_app(app)
...
return app
class User(db.Model):
__tablename__ = 'user'
__talbe_args__ = {'schema':'public'}
company = db.Column(db.String(10))
class SomePublicModel(db.Model):
__tablename__ = 'some_public'
__talbe_args__ = {'schema':'public'}
...
class SomeModelByDynamicSchema(db.Model):
__tablename__ = 'some_dynamic'
__talbe_args__ = {'schema':'dynamic'}
...
dynamic
схема будет заменить на другое значение по компании пользователя во время выполнения.
Предполагая, что у меня уже есть в базе данных схем public
и dynamic
и я хочу, чтобы создать новую схему с таблицами, что-то вроде этого:
def create_new():
user = User(company='foo')
db.session.execute("CREATE SCHEMA IF NOT EXISTS %s" % user.company)
db.session.connection().execution_options(schema_translate_map={'dynamic':user.company})
#I would like to do something of the kind
db.create_all()
Я ожидал, что таблицы будут созданы в foo
схеме как foo.some_dynamic
, но SQLAlchemy по-прежнему пытается создать в схеме dynamic
.
Может кто-нибудь мне помочь?