2016-06-10 96 views
0

我想將兩個MySQL數據庫添加到我的Flask應用程序中。不幸的是,這些數據庫幾乎相同。 它們具有相同的表格和列名稱,但數據不同。將相同的SQLAlchemy表附加到具有不同綁定的兩個模型

我使用SQLALCHEMY_BINDS我config.py

SQLALCHEMY_BINDS = { 
    'old': 'mysql://[OLD_DB_HERE]', 
    'new': 'mysql://[NEW_DB_HERE]' 
} 

然後在我的models.py

class CallOld(db.Model): 
    __bind_key__ = 'old' 
    __table__ = db.Model.metadata.tables['ConferenceCall2'] 

class CallNew(db.Model): 
    __bind_key__ = 'new' 
    __table__ = db.Model.metadata.tables['ConferenceCall2'] 

的問題是,當我叫兩個表的查詢,我得到了相同的結果。

例如,CallOld.query.with_entities(CallOld.TenantName.distinct()).all()CallNew.query.with_entities(CallNew.TenantName.distinct()).all() 返回相同。

有趣的是,輸出是總是從兩個模型類的第二個。顯然第二類(CallNew在這種情況下)會覆蓋第一類(CallOld)。

如何將相同的表定義附加到具有不同綁定的兩個模型?

+0

http://stackoverflow.com/questions/7877196/flask-sqlalchemy-create-several-tables-with-all-fields-identical,你有一個原因,你必須嘗試使用​​相同的'表'對象,即使這些模型是針對不同的數據庫的。使用mixin可能會馬上解決這個問題。 –

+0

這些數據庫已經存在,我只需要將我的Flask應用程序連接到它們。第一個是舊的,第二個是新的。但是他們的結構和表格名稱是相同的。這就是爲什麼我使用相同的表名。無論如何,我會檢查混合。希望這會幫助我解決問題。 – Galil

回答

0

您應該使用這個mixin:使用declarative時分享一些功能,比如一組公共列

的共同需要...

之所以輸出始終來自第二個(新)模型的綁定數據庫,因爲您爲兩個模型手動定義__table__ Flask的聲明性擴展work their black magic

def __init__(self, name, bases, d): 
    bind_key = d.pop('__bind_key__', None) or getattr(self, '__bind_key__', None) 
    DeclarativeMeta.__init__(self, name, bases, d) 
    if bind_key is not None and hasattr(self, '__table__'): 
     self.__table__.info['bind_key'] = bind_key 

可以看出__table__.info['bind_key']被覆蓋在表中傳遞給的每個聲明類中。

相關問題