【发布时间】:2016-06-30 19:14:28
【问题描述】:
我有一个对象,它有另一个对象的外键。我们将第一个对象称为A,将第二个对象称为B。 A 可以表示为(integer id, integer b_id, integer some_data),B 可以表示为(integer id, integer datum_one, integer datum_two)
datum_one 和datum_two 在B 中形成一个独特的组合(我认为这是正确的术语——我不希望在 B 中输入这些字段的相同组合)。但是,我只想引用从A 指向B 的ForeignKey 中的id。做复合外键like here 之类的事情似乎很乏味和多余。
我希望有这样的功能,当我将A 添加到我的数据库时,它首先搜索具有相同datum_one 和datum_two 的匹配B。如果存在,它将使用数据库中的匹配条目,否则它会在表中添加一个新行,表示 B。
有没有办法做到这一点?我怀疑该解决方案与合并指令有关,但我不确定如何准确获取此功能。
我考虑过的一个潜在解决方案实际上是使用 UNIQUE 指令,但似乎 SQLAlchemy 不能很好地使用 unique - 我基本上只需要编写自己的错误处理,这是一个选项,但我希望 SQLAlchemy 能对此有更优雅的解决方案。
【问题讨论】:
-
Merge 无法帮助您,因为它对主键进行操作。根据基准值选择或插入新的 B 时,您没有。在这种情况下,我也不太明白复合外键如何为您提供帮助。您必须做的,并且您已经部分地进行了布局,是在基准上使用唯一约束,并基于该约束插入或选择现有(或相反,如果您主要使用现有基准)。 SQLAlchemy 究竟如何在独特的约束下“玩得很好”?
-
既然您已将其标记为sqlite,您可以先将
INSERT OR IGNORE放入B,然后从B 中选择id。它会忽略唯一约束违规(如果有),然后选择(可能插入)ID。 -
参见 this question and answer 了解如何在 SQLAlchemy 中使用 DB 特定功能,如
OR IGNORE。另请参阅 this answer by Michael Bayer 关于Session.merge、主键和唯一约束。
标签: python sql sqlite sqlalchemy