2011-08-05 63 views
0

好了,所以我有兩個問題:蟒蛇類的屬性和SQL鍊金術關係

我的第一個會被SQLAlchemy的關係。所以我不得不使用sqllite,我必須實施一些級聯刪除。現在我發現關係可以完成這些工作,但是這些工作應該在父表中正常聲明。但由於一些設計決策,我不得不這樣做的孩子,所以我做這樣的事情:

class Operation(Base): 
    """ 
    The class used to log any action executed in Projects. 
    """ 
    __tablename__ = 'OPERATIONS' 

    id = Column(Integer, primary_key=True) 
    parameters = Column(String) 
    ..... rest of class here .... 

class DataType(Base): 

    __tablename__ = 'DATA_TYPES' 
    id = Column(Integer, primary_key=True) 
    gid = Column(String) 
    ...more params... 
    parent_operation = relationship(Operation, backref=backref("DATA_TYPES", 
                order_by=id, 
                cascade="all,delete")) 
    ...rest of class... 

現在,這似乎是工作,但我仍然不能確定的一些事情。

  • 首先,我可以用parent_operation從這裏結束?我的意思是我看到級聯工作,但除了實際聲明外,我沒有使用parent_operation。

    • 其次,在上述情況下,這是在backref第一個參數,這是否需要爲孩子表的名稱或是否需要爲每模式獨特「DATA_TYPES」?

    • 最後,在我的情況下,Operation和DataType類都在同一個模塊中,所以我可以將Operation作爲關係中的第一個參數傳遞。現在,如果這wasnt的情況下,我會對他們在單獨的模塊,如果我還是想聲明這個關係,我應該通過「操作」或「操作」的關係(類名或表名?)


現在我的第二個是更多的核心Python,但由於它仍然與上述的一些連接,我會在這裏添加它。所以我需要能夠通過dinamically添加類屬性。基本上我需要添加一個像上面聲明的關係。

class BaseClass(object)  

def __init__(self): 
    my_class = self.__class__ 
    if not hasattr(my_class, self.__class__.__name__): 
     reference = "my_class." + self.__class__.__name__ + "= relationship\ 
     ('DataType', backref=backref('" + self.__class__.__name__ + "', \ 
     cascade='all,delete'))" 
     exec reference 

的,爲什麼我需要做的這是複雜的,有一些設計決策,這樣做的原因(基本上,我需要每一個擴展該有申報的「數據類型」階級關係類)。現在我知道使用exec聲明並不是一個好的做法。那麼有沒有更好的方法來做到這一點?

問候, 波格丹

回答

0

對於第二部分或你的問題,請記住,在你的類的構造函數什麼不會被SQLAlchemy的儀器。在您的例子,你可以簡單地聲明的關係,自己的類(注意:它不會從你繼承declarative_base類),然後在任何子類像這樣繼承它:

class BaseDataType(object): 
    parent_operation = relationship(Operation, backref="datatype") 

class DataTypeA(Base, BaseDataType): 
    id = Column(Integer, primary_key=True) 

class DataTypeB(Base, BaseDataType): 
    id = Column(Integer, primary_key=True) 

的SQLAlchemy的文檔提供了一個什麼樣的好例子可能:

http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#mixing-in-relationships

+0

感謝您的輸入。我的最終解決方案是使用sqlalchemy.ext.declarative中的@declared_attr並在那裏創建關係。 – Bogdan