2011-04-27 10 views
6

Mam kilka standardowych modeli SQLAlchemy, które ponownie wykorzystuję w projektach. Coś takiego:Ponowne wykorzystywanie modeli SQLAlchemy w różnych projektach

from sqlalchemy import Column, Integer, String, Unicode 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Category(Base): 
    __tablename__ = 'category' 

    id = Column(Integer, primary_key=True) 
    slug = Column(String(250), nullable=False, unique=True) 
    title = Column(Unicode(250), nullable=False) 

    def __call__(self): 
     return self.title 

Chciałbym umieścić to w udostępnionej biblioteki i zaimportować go do każdego nowego projektu zamiast wycinania i wklejania, ale nie mogę, ponieważ instancja declarative_base definiuje odrębnie projekt. Jeśli jest ich więcej, nie będą udostępniać sesji. Jak to obejść?

Here's another question that suggests using mixin classes. Czy to może działać? Czy SQLAlchemy dokładnie zaimportuje klucze obce z klas mixin?

+0

Co robisz z obiektami bazy po tym? Na koniec pamiętam, że udało mi się połączyć wiele metadanych z wielu obiektów Base, wiążąc je wszystkie do tego samego silnika. Wyobrażam sobie, że wystarczy użyć sesji z tego silnika, aby uzyskać dostęp do wszystkich zdefiniowanych tabel. –

+0

Nic więcej za pomocą obiektu Base. Jeśli wiązanie z metadanymi wystarczy, mogę łatwo importować i ponownie wiązać - przy jednoczesnym zapewnieniu, że dwie oddzielne aplikacje nie działają w tym samym procesie Python. –

Odpowiedz

3

Po wywołaniu

Base = declarative_base()

SA utworzyć nową metadata tego Base.

Aby ponownie użyć modeli należy wiązać metadata głównych modeli do modeli wielokrotnego użytku, ale przed każdym imporcie swoimi wielokrotnego użytku modeli przez:

Base.metadata = my_main_app.db.metadata

klas mixin przydatnych do powtarzania deklaracji kolumn i rozszerzenie metody klasy . Dla aplikacji wielokrotnego użytku opartych na MixIns musisz zdefiniować konkretną klasę w kodzie manualnym dla każdego modelu.

Czy SQLAlchemy dokładnie zaimportuje kluczy obcych z klas mixin?

klasa wstawek z klucza obcego i ograniczenia

from sqlalchemy.schema import UniqueConstraint 
from sqlalchemy.ext.declarative import declared_attr 

class MessageMixIn(object): 
    ttime = Column(DateTime) 

    @declared_attr 
    def sometable_id(cls): 
     return Column(Integer, ForeignKey('sometable.id')) 

    @declared_attr 
    def __table_args__(cls): 
     return (UniqueConstraint('sometable_id', 'ttime'), {}) 
+0

Dzięki. Pozwól mi spróbować. –