Per il mio caso d'uso questo ha funzionato:
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)
O, meglio ancora, unire automaticamente tutte le basi dichiarativi:
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)
Quella meta dati possono poi essere utilizzati ad esempio per creare un diff per il database corrente:
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)
fonte
2017-01-29 23:37:34