2012-08-02 29 views
5

Kodumuzdaki kodlamayı önlemek için sütun eşleştirmesi yapmak üzere sqlalchemy'nin otomatik yükleme özelliğini kullanıyoruz.sqlalchemy autoloaded orm persistence

class users(Base): 
    __tablename__ = 'users' 
    __table_args__ = { 
     'autoload': True, 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 

bir seri hale getirmek için bir yol veya önbellek otomatik yüklenmesi meta/ORMs yüzden özdevinimli_yükle sürecinde diğer yazıları/fonksiyonları bizim orm sınıfları başvurmak gerekir her zaman gitmek gerekmez mi var?

Kabak önbelleğe alma ve turşuya baktım, ancak mümkün olduğunda veya nasıl yapılacağı konusunda açık bir cevap bulamadı.

İdeal biz

Herhangi bir fikir, bizim veritabanı yapısında değişiklik işlemiş yalnızca autload haritalama komut dosyasını çalıştırmak ancak komut/fonksiyon diğer tüm bizim veritabanı haritalama olmayan bir özdevinimli_yükle/kalıcı/önbelleğe sürümü başvurmak?

+0

Neden başka bir yol yapmıyorsunuz: SA'daki tam üfleme modelini tanımlayın. Bir yan etki olarak, bu veritabanı şeması için kaynak kontrolünüz olarak hareket edecektir. * Tabii ki, bu sadece sizin SA uygulamanızın çalıştığı veritabanı (lerin) birincil kontrolüne sahipse çalışır * – van

+0

Veri tabanı gelişiminin benim durumumda ayrı ayrı ele alınması, uygulamanın tam kontrole sahip olmadığı anlamına gelir. Bununla birlikte, meta verileri toplama yöntemini buldum, bu yüzden sadece bir kere veritabanı bağlantısı üzerinden, turşusu oluşturmak için bir kez daha db bağlantısıyla (aşağıya bakınız) yansıyan, yansıtılan meta veriyi kullandığım zamanı seçtim. – user1572502

cevap

5

Şu an yaptığım şey, yansımayı bir veritabanı bağlantısı (MySQL) üzerinden yürüttükten sonra meta verileri almak ve bir turşu seçildiğinde, bu meta veriyi bir SQLite motoruna bağlı meta verilerle şema üzerinde yansıtmak için kullanın.

cachefile='orm.p' 
dbfile='database' 
engine_dev = create_engine(#db connect, echo=True) 
engine_meta = create_engine('sqlite:///%s' % dbfile,echo=True) 
Base = declarative_base() 
Base.metadata.bind = engine_dev 
metadata = MetaData(bind=engine_dev) 

# load from pickle 
try: 
    with open(cachefile, 'r') as cache: 
     metadata2 = pickle.load(cache) 
     metadata2.bind = engine_meta 
     cache.close() 
    class Users(Base): 
     __table__ = Table('users', metadata2, autoload=True) 

    print "ORM loaded from pickle" 

# if no pickle, use reflect through database connection  
except: 
    class Users(Base): 
     __table__ = Table('users', metadata, autoload=True) 

print "ORM through database autoload" 

# create metapickle 
metadata.create_all() 
with open(cachefile, 'w') as cache: 
    pickle.dump(metadata, cache) 
    cache.close() 

Sorun olup olmadığı hakkında herhangi bir yorum (çalışıyor) veya geliştirebileceğim bir şey var mı?

+2

muhtemelen sadece bir MetaData nesnesini kullanmak için bunu basitleştirebilir ve aynı zamanda basit bir "eğer os.path.exists (cachefile)" komutunu seçip çıkarmayacağınızı belirleyebilirsiniz. "Tablo ('users', metadata, autoload = True)" ve daha önce görüldüğü gibi bir kez belirtmeniz gerekiyor çünkü tablo MetaData'da ise yansımayı atlıyor. – zzzeek

+1

Sanırım bir 'with' ifadesinde kullanıldığında bir dosya kapatmaya gerek yok, ama bu alakalı değil. Yaklaşımınız ilginç görünüyor, beklendiği gibi çalışıyor mu? – jadkik94