我遇到了一个基本用例 - 我有两个表,节点和网络,它们使用第三个表IPAddr作为辅助关联表进行互连:
class Node(Base, BasicValidator):
__tablename__ = 'nodes'
id = Column(Integer, primary_key=True)
class IPAddr(Base):
__tablename__ = 'ip_addrs'
id = Column(Integer, primary_key=True)
network = Column(Integer, ForeignKey('networks.id'))
node = Column(Integer, ForeignKey('nodes.id'))
ip_addr = Column(String(25), nullable=False)
class Network(Base, BasicValidator):
__tablename__ = 'networks'
id = Column(Integer, primary_key=True)
nodes = relationship(
"Node",
secondary=IPAddr.__table__,
backref="networks")
现在,当我从数据库中删除网络对象时,我收到以下错误:
详细信息:仍然从表“ip_addrs”引用Key(id)=(9)。 'DELETE FROM networks WHERE networks.id =%(id)s'({'id':6},{'id': 7},{'id':8},{'id':9},{'id':10})
我需要做的就是在删除Network和IPAddr时保留节点。
我试过这个:http://docs.sqlalchemy.org/en/rel_0_7/orm/relationships.html#association-object但它没有帮助,即使使用AssociacionProxy,因为这一切都有效但Network.nodes返回 [无] 如果我做这样的事情,然后删除节点:
class Node(Base, BasicValidator):
__tablename__ = 'nodes'
id = Column(Integer, primary_key=True)
class IPAddr(Base):
__tablename__ = 'ip_addrs'
id = Column(Integer, primary_key=True)
network = Column(Integer, ForeignKey('networks.id'))
node = Column(Integer, ForeignKey('nodes.id'))
nodes = relationship("Node", backref="networks_assocs")
ip_addr = Column(String(25), nullable=False)
class Network(Base, BasicValidator):
__tablename__ = 'networks'
id = Column(Integer, primary_key=True)
nd = relationship("IPAddr", backref="networks")
nodes = association_proxy('nd', 'nodes')
有人可以帮忙吗,这样做的正确方法是什么?
答案 0 :(得分:0)
如果您的数据库支持,您需要使用类似ON DELETE CASCADE的东西。
在此处查看更多信息:http://docs.sqlalchemy.org/en/latest/orm/session.html#unitofwork-cascades