我正在尝试使用 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 不存在,我会收到一个 Integrity 错误,而且我不知道哪个 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