0

sqlalchemy 0.7.10 を使用して多対多の関係を処理しようとしています。私の問題は、錬金術が関連付けテーブルへの重複エントリの挿入を黙って省略していることです。望ましい動作は、db から DB Duplicate Entry エラーを取得し、ユーザーに通知することです。

モデルは次のとおりです。

class Node(BASE):
    __tablename__ = "nodes"
    .....

class ZoneNodeAssociation(BASE):
    __tablename__ = "zone_node_association"
    node_id = Column(Integer, ForeignKey('nodes.id'),
                     primary_key=True, nullable=False)
    zone_id = Column(Integer, ForeignKey('zones.id'),
                     primary_key=True, nullable=False)    

class Zone(BASE):
    __tablename__ = "zones"
    id = Column(Integer, primary_key=True, nullable=False, autoincrement=True)
    name = Column(String(255), unique=True)
    nodes = relationship("Node",
                         secondary="zone_node_association",
                         backref="zones",)

そしてアクション:

def zone_add_node(context, zone_id, node_id):
    session = get_session()
    with session.begin():
        zone_ref = _zone_get(context, zone_id, session)
        node_ref = _node_get(context, node_id, session)
        zone_ref.nodes.append(node_ref)
        zone_ref.save(session=session)

初めて関連付けテーブルのエントリが期待どおりに追加されますが、重複を追加しようとすると、エラーなしで終了します。

次のように関連テーブルに直接挿入するとき

session = get_session()
with session.begin():
    association_entry = models.ZoneNodeAssociation()
    association_entry.update({'zone_id': zone_id, 'node_id': node_id})
    association_entry.save(session=session)

期待どおりに動作しますが、ID の 1 つが存在しない場合、整合性エラーが発生し、正確にどの ID が間違っているのかわからないため、この方法は好きではありません。したがって、代わりに最初のアプローチを使用したいと思います。

私が見つけたすべての同様の質問には逆の問題があります-重複を静かに省略したいのですが、なんてこった、エラーが必要です! =)

また、sqlalchemy の変更ログで何かを見つけました: http://docs.sqlalchemy.org:8000/en/rel_0_7/changelog/changelog_05.html#change-1a61f53a8bf148ab3f8311330af61a4e しかし、私が理解しているように、それは 0.5 リリースで修正されました。 m 0.7.10 を使用

アップデート:

別の環境でプレイしようとしましたが、同じ動作になりました。コードは次のとおりです: https://gist.github.com/max-lobur/6366708

4

1 に答える 1

0

関係で lazy='dynamic' を指定する必要があると思います。

ノード = 関係 ("ノード"、セカンダリ = "zone_node_association"、backref = "ゾーン"、lazy = '動的')

于 2015-03-24T02:17:21.417 に答える