好了,所以我有兩個問題:蟒蛇類的屬性和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
聲明並不是一個好的做法。那麼有沒有更好的方法來做到這一點?
問候, 波格丹
感謝您的輸入。我的最終解決方案是使用sqlalchemy.ext.declarative中的@declared_attr並在那裏創建關係。 – Bogdan