【问题标题】:SQLAlchemy look up and merge object before addingSQLAlchemy 在添加之前查找并合并对象
【发布时间】:2016-06-30 19:14:28
【问题描述】:

我有一个对象,它有另一个对象的外键。我们将第一个对象称为A,将第二个对象称为BA 可以表示为(integer id, integer b_id, integer some_data)B 可以表示为(integer id, integer datum_one, integer datum_two)

datum_onedatum_twoB 中形成一个独特的组合(我认为这是正确的术语——我不希望在 B 中输入这些字段的相同组合)。但是,我只想引用从A 指向B 的ForeignKey 中的id。做复合外键like here 之类的事情似乎很乏味和多余。

我希望有这样的功能,当我将A 添加到我的数据库时,它首先搜索具有相同datum_onedatum_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


【解决方案1】:

我认为您应该在将对象插入数据库之前自己处理这个问题。来自文档...http://docs.sqlalchemy.org/en/latest/core/events.html

from sqlalchemy import event

# standard decorator style
@event.listens_for(SomeSchemaClassOrObject, 'before_create')
def receive_before_create(target, connection, **kw):
    "listen for the 'before_create' event"

    # ... (event handling logic) ...

【讨论】:

  • 啊,我喜欢这个解决方案。我已经编写了一些代码来处理这个问题,但是这种特殊的方法可能更简洁。
猜你喜欢
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
相关资源
最近更新 更多