假设我有这样的东西:
class Tab(Base):
a = 'a'
b = 'b'
c = 'c'
def __init__(self):
self.c_a = DBSession.query(Table2).filter(Table2.a == self.a).all()
self.c_a
似乎只应用于我插入的项目。我想确保 __init__
中指定的操作(这只是一个示例,可能通过 relationship()
更好地完成,但发挥你的想象力)适用于所有对象,包括 SA 从我的数据库中查询的对象。有人知道怎么做吗?
我觉得我可能误解了什么,如果是的话请指正。
最佳答案
从模型内部引用数据库是一种抽象泄漏;模型不必知道它们可能驻留的持久性的细节;它们可能根本不持久(毕竟它们是模型,并且可能用于任何类型的计算。)
当尝试与其他实体建立关联时,您应该始终使用 relationship()
,无论是否存在底层持久性存储,它都可以正常工作。更重要的是,当您使用 SQLAlchemy 进行动态生成的查询时,关系很有用;在模型方法中执行查询不允许这种灵 active 。
如果您确定需要在模型层(而不是 Controller 层,通常应该这样做)对 session 进行操作,那么您肯定不应该使用全局 session 实例;始终从对象本身计算 session :
class MyModel(Base):
def frobnicate(self):
session = sqlalchemy.orm.Session.object_session(self)
if session is None:
raise ValueError("not connected to a session")
session.query(...)
关于python - 使用 SqlAlchemy 在 __init__ 上一致应用东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886608/