3

基本的なユースケースに遭遇しました。ノードとネットワークの2つのテーブルがあり、2番目の関連付けテーブルとして3番目のテーブル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")

データベースからネットワークオブジェクトを削除しているときに、次のエラーが発生します。

詳細:キー(id)=(9)は引き続きテーブル"ip_addrs"から参照されます。'ネットワークから削除WHEREnetworks.id=%(id)s'({'id':6}、{'id':7}、{'id':8}、{'id':9}、{' id':10})

私がする必要があるのは、ネットワークと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')

誰かが助けてくれますか、それを行うための適切な方法は何ですか?

4

1 に答える 1

0

データベースがサポートしている場合は、ON DELETE CASCADE などを使用する必要があります。

詳細については、こちらをご覧ください: http://docs.sqlalchemy.org/en/latest/orm/session.html#unitofwork-cascades

于 2013-03-18T14:49:43.780 に答える