好了,所以我有两个问题:蟒蛇类的属性和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