2015-04-29 24 views
7

'da birden çok bildirim temelini birleştirme Bir _BoundDeclarativeMeta örneğini başka biriyle birleştirmek mümkün mü? ÖrneğinSQLAlchemy

: Ben birleştirme önce onlardan her birinden orm modelleri sınıflara olacağını Gerçekte

from sqlalchemy.ext.declarative import declarative_base 

Base1 = declarative_base() 
Base2 = declarative_base() 

# Something like this? 
CombinedBase = Base1.merge(Base2) 

. Sorun şu ki, çalışmak için belirli tablolara ihtiyaç duyan bağımsız bir paketim var. Yine de başka bir bağımsız paket tarafından kullanılacak. Benim kullanım durumunda İçin

cevap

1

bu çalıştı:

from sqlalchemy import MetaData 

combined_meta_data = MetaData() 

for declarative_base in [Base1, Base2]: 
    for (table_name, table) in declarative_base.metadata.tables.items(): 
     combined_meta_data._add_table(table_name, table.schema, table) 

Veya daha da iyisi, otomatik olarak tüm bildirim bazlar birleştirme:

import gc 
from sqlalchemy import MetaData 

combined_meta_data = MetaData() 

for declarative_base in ([obj for obj in gc.get_objects() if isinstance(obj, DeclarativeMeta)]): 
    for (table_name, table) in declarative_base.metadata.tables.items(): 
     combined_meta_data._add_table(table_name, table.schema, table) 

meta veriler daha sonra bir diff oluşturmak için örneğin kullanılabilir That şu anki veri tabanı:

from sqlalchemy import create_engine 
from alembic.migration import MigrationContext 
from alembic.autogenerate import compare_metadata 
import pprint 

engine = create_engine(...) 
migration_context = MigrationContext.configure(engine.connect()) 

diff = compare_metadata(migration_context, combined_meta_data) 
pprint.pprint(diff)