Sqlalchemy 0.7.10默默地省略了多对多关系中的重复条目

时间:2013-08-23 11:03:35

标签: python sqlalchemy many-to-many

我正在尝试使用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不存在我得到一个完整性错误,我不知道哪个ID错了。所以我想改用第一种方法。

我发现的所有类似问题都存在问题 - 他们想要默默地省略重复,但该死的我需要错误! =)

我还在sqlalchemy更改日志中找到了一些内容: http://docs.sqlalchemy.org:8000/en/rel_0_7/changelog/changelog_05.html#change-1a61f53a8bf148ab3f8311330af61a4e 但据我所知,它已在0.5版本中修复,我正在使用0.7.10

更新

我试图在一个单独的环境中玩,并获得相同的行为。这是代码: https://gist.github.com/max-lobur/6366708

1 个答案:

答案 0 :(得分:0)

我认为您需要在关系中指定lazy ='dynamic'。

nodes = relationship(“Node”,secondary =“zone_node_association”,backref =“zones”,lazy ='dynamic')