2017-02-15 9 views
0

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.

Может кто-нибудь мне помочь?

ответ

1

Когда вы устанавливаете параметры выполнения, вы создаете копию соединения. Это означает, что create_all выполняется без schema_translate_map.

>>> c = Base.session.connection() 
>>> w = c.execution_options(schema_translate_map={'dynamic':'kek'}) 
>>> c._execution_options 
immutabledict({}) 
>>> w._execution_options 
immutabledict({'schema_translate_map': {'dynamic': 'kek'}})