2017-02-15 70 views
0

的SQLAlchemy的變革提供了Connection.execution_options.schema_translate_map執行時間的模式,如docs說。燒瓶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模式將被取代,根據用戶所在的公司在執行時間上的其他價值。

假設我已經在數據庫中的模式publicdynamic和我想創建一個表的新模式,是這樣的:

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'}})