0

首先,这是我第一个使用 SQLAlchemy 的项目,所以我还是个新手。

我正在制作一个处理 GTFS 数据的系统。我有一个似乎能够非常有效地查询数据的后端。

我想要做的是允许 GTFS 文件用新数据更新数据库。我遇到的问题很明显,如果我试图插入的数据已经在数据库中,我们就会在主键的唯一性上发生冲突。

出于效率原因,我决定使用以下代码进行插入,其中 model 是我想要插入数据的模型对象,data 是要插入的预先计算的、已清理的字典列表。

 for chunk in [data[i:i+chunk_size] for i in xrange(0, len(data), chunk_size)]:
    engine.execute(model.__table__.insert(),chunk)

想到了两种解决方案。

  1. 我找到了一种插入的方法,这样如果发生碰撞,我们不在乎,也不会失败。我相信上面的代码使用的是TableClause,所以我先在那里检查,希望找到合适的替代品或标志,但没有运气。

  2. 在执行数据清理之前,我们获取主键值列表,如果给定元素与主键匹配,我们跳过清理并插入值。我发现我能够从Table.primary_key获得 PrimaryKeyConstraint ,但我似乎无法将 Columns 取出,或者找到仅查询特定列(在我的情况下是主键)的方法。

如果我能找到办法,要么就足够了。

在过去几个小时查看了这两个之后,我似乎都找不到。我希望有人可能以前做过这件事,并指出我正确的方向。

在此先感谢您的帮助!

更新 1:上面没有提到第三个选项。那就是清除数据库中的所有数据,然后重新插入。我不希望这样做,因为即使使用小型 GTFS 文件,也很容易插入数十万个元素,而且这似乎需要大约半小时才能执行,这意味着如果将其投入生产,就会有很多停机时间更新。

4

1 回答 1

1

使用 SQLAlchemy,您只需创建模型类的新实例,并将其合并到当前会话中。SQLAlchemy 将检测它是否已经知道该对象(来自缓存或数据库),并在需要时向数据库添加新行。

newentry = model(chunk)
session.merge(newentry)

另请参阅此问题的上下文:Fastest way to insert object if it doesn't exist with SQLAlchemy

于 2012-09-16T20:39:51.040 回答