SQLAlchemy ON DELETE在使用辅助表时设置为NULL

时间:2013-03-18 14:18:25

标签: python foreign-keys sqlalchemy relationship

我遇到了一个基本用例 - 我有两个表,节点和网络,它们使用第三个表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')

有人可以帮忙吗,这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您的数据库支持,您需要使用类似ON DELETE CASCADE的东西。

在此处查看更多信息:http://docs.sqlalchemy.org/en/latest/orm/session.html#unitofwork-cascades