2010-05-04 29 views
19

SQLAlchemy sınıflarını, zaman içinde sayı olarak artacak çok sayıda harici veri kaynağına erişmek için oluşturmamız gerekiyor. Temel ORM modellerimiz için bildirimsel tabanı kullanıyoruz ve autoload = otomatik olarak eşleştirmeyi oluşturmak için yeni ORM sınıflarını manuel olarak belirleyebileceğimizi biliyorum.SQLAlchemy'de Dinamik Sınıf Oluşturma

class MyObject(Base): 
    __tablename__ = 'my_internal_table_name' 
    __table_args__ = {'autoload':True} 

Biz istemiyoruz: Bu dinamik gibi bir şeye dönüştürüyor

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

stored={} 
stored['tablename']='my_internal_table_name' 
stored['objectname']='MyObject' 

ve:

sorun dinamik olarak alarak böyle bir şey onları üretmek mümkün olması gerektiğidir bir bağlantı açmak, sorguları gerçekleştirmek ve sonra bağlantıyı kapatmak için gerekli olandan daha uzun sürecek sınıflar. Bu nedenle, ideal olarak, "saklanan" değişken içerisindeki öğeleri bir veri tabanına koyabilir ve bunları gerektiği gibi çekebiliriz. Diğer zorluk, nesne isminin (ör. "MyObject") farklı bağlantılarda kullanılabilmesidir, bu yüzden bunu bir kez tanımlayamaz ve etrafta tutamazız.

Bunun nasıl gerçekleştirilebileceğine dair herhangi bir öneri çok takdir edilecektir. Dinamik 3-argument call to type kullanarak MyObject oluşturabilir

cevap

24

Teşekkür ... Örneğin:

type(name, bases, dict) 

    Return a new type object. This is essentially a dynamic form of the 
    class statement... 

:

mydict={'__tablename__':stored['tablename'], 
     '__table_args__':{'autoload':True},} 

MyObj=type(stored['objectname'],(Base,),mydict) 
print(MyObj) 
# <class '__main__.MyObject'> 
print(MyObj.__base__) 
# <class '__main__.Base'> 
print(MyObj.__tablename__) 
# my_internal_table_name 
print(MyObj.__table_args__) 
# {'autoload': True} 
+0

çocuk ... i aptal hissediyorum. Böyle basit bir çözüm. Tip yönteminin çok güçlü olduğunu anlamadım. o SQLAlchemy dahil edilebilir, böylece biraz küresel alan nesne adını koymak için bir çözüm modifiye direkt olarak sorgular: globalsi() [saklanan [ 'ObjectName']] = tipi (depolanmış [ 'ObjectName'], (Base,), mydict) Teşekkürler ... harika çözüm. – PlaidFan

+3

Aptal hissetme! Bu hileyi, başkalarını SO'da kullandığını izleyerek öğrendim. Şimdi de hile biliyorsunuz ve arkadaşlarınızı da vay canına geçirebilirsiniz. :) – unutbu