2011-04-27 49 views
6

我有一些標準的SQLAlchemy模型,可以跨項目重複使用。事情是這樣的:跨項目重用SQLAlchemy模型

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 

我希望把這個共享庫,將其導入到每一個新項目,而不是剪切和粘貼的,但我不能,因爲declarative_base實例在單獨定義該項目。如果不止一個,他們將不會分享會話。我如何解決這個問題?

Here's another question that suggests using mixin classes。這可以工作嗎? SQLAlchemy會從mixin類準確地導入外鍵嗎?

+0

你拿後此基礎對象在做什麼?最後我記得,我能夠通過將多個元數據綁定到同一個引擎,將多個元數據從多個Base對象合併在一起。我可以想象,使用該引擎中的會話訪問您定義的所有表就足夠了。 – 2011-04-27 18:57:47

+0

基礎對象沒有更多。如果綁定到元數據是我所需要的,我可以輕鬆導入並重新綁定 - 同時確保兩個單獨的應用程序不在同一個Python進程中運行。 – 2011-06-03 14:11:24

回答

3

當你調用

Base = declarative_base()

SA此Base創造新metadata

要重複利用的模型,你必須綁定主力車型可重複使用的機型metadata,但您可重用的模型的任何進口前:

Base.metadata = my_main_app.db.metadata

的重複列的聲明,並延長類方法有用混入類。 對於connecting基於MixIns的可重複使用的應用程序,您必須爲每個模型定義具體的代碼。

請問SQLAlchemy準確地從mixin類中導入 外鍵嗎?

混合類與外鍵和約束

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

謝謝。讓我嘗試一下。 – 2011-04-30 06:09:15