sqlalchemy relationship实例添加顺序

编写于

近来一直埋头到python的编程中。
用到了sqlalchemy这个库,记录下以下一个案例。

定义两个Model类
class A(Model):

child = relationship(‘B’, backref=‘parent’)

class B(Model):

a_id = Column(…, ForeignKey(A.id))

然后我们要将B实例添加到A实例child中,正确的做法是,先读取A实例到会话中后操作B实例:
>>> a = A.query.filter(…).first()
>>> b = B() or B.query.filter(…).first()
>>> a.child.append(b)
>>> db.session.commit()
OK

这样是没有问题,当然留意,让建立B后再读取A实例到会话,提交的时候会提示A实例已经有变化的错误,如下:
>>> b = B() or B.query.filter(…).first()
>>> a = A.query.filter(…).first()
>>> a.child.append(b)
>>> db.session.commit()
ObjectDereferencedError: Can’t emit change event for attribute ‘A.child’ - parent object of type has been garbage collected