Dynamiczne tworzenie klas w SQLAlchemy

Musimy stworzyć klasy SQLAlchemy, aby uzyskać dostęp do wielu zewnętrznych źródeł danych, które z czasem będą się zwiększać. Używamy deklaratywnej bazy dla naszych podstawowych modeli ORM i Wiem, że możemy ręcznie określić nowe klasy ORM używając autoload = True, aby automatycznie wygenerować mapowanie.

Problem polega na tym, że musimy być w stanie generować je dynamicznie biorąc coś takiego:

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

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

I zamieniając go w coś takiego dynamicznie:

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

Nie chcemy, aby klasy utrzymywały się dłużej niż jest to konieczne do otwarcia połączenia, wykonania zapytań, a następnie zamknięcia połączenia. Dlatego idealnie, możemy umieścić elementy w" przechowywanej " zmiennej powyżej do bazy danych i wyciągnąć je w razie potrzeby. Innym wyzwaniem jest to, że nazwa obiektu (np." MyObject") może być używana na różnych połączeniach, więc nie możemy go zdefiniować raz i utrzymać.

Wszelkie sugestie, jak można to osiągnąć, byłyby doceniam to.

Dzięki...
Author: PlaidFan, 2010-05-04

1 answers

Możesz dynamicznie utworzyć MyObject używając 3-argumentowego wywołania do type:

type(name, bases, dict)

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

Na przykład:

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}
 31
Author: unutbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-04 21:09:13