2015-04-29 3 views
7

में एकाधिक घोषणात्मक अड्डों को मर्ज करें क्या किसी अन्य के साथ _BoundDeclarativeMeta इंस्टेंस को मर्ज करना संभव है?SQLAlchemy

उदाहरण के लिए:

from sqlalchemy.ext.declarative import declarative_base 

Base1 = declarative_base() 
Base2 = declarative_base() 

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

वास्तविकता मैं विलय से पहले उनमें से प्रत्येक से ORM मॉडल उपवर्गीकरण किया जाएगा में। समस्या यह है कि मेरे पास एक स्वतंत्र पैकेज है जिसे काम करने के लिए कुछ तालिकाओं की आवश्यकता है। फिर भी इसका इस्तेमाल एक और स्वतंत्र पैकेज द्वारा किया जा रहा है।

उत्तर

1

मेरी उपयोग के मामले के लिए यह काम किया:

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) 

या, और भी बेहतर, स्वचालित रूप से सभी कथात्मक ठिकानों विलय:

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) 

मेटा डेटा तो करने के लिए एक अंतर बनाने के लिए उदाहरण के लिए इस्तेमाल किया जा सकता है कि वर्तमान डेटाबेस:

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)