首先,这是我第一个使用 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)
想到了两种解决方案。
我找到了一种插入的方法,这样如果发生碰撞,我们不在乎,也不会失败。我相信上面的代码使用的是TableClause,所以我先在那里检查,希望找到合适的替代品或标志,但没有运气。
在执行数据清理之前,我们获取主键值列表,如果给定元素与主键匹配,我们跳过清理并插入值。我发现我能够从Table.primary_key获得 PrimaryKeyConstraint ,但我似乎无法将 Columns 取出,或者找到仅查询特定列(在我的情况下是主键)的方法。
如果我能找到办法,要么就足够了。
在过去几个小时查看了这两个之后,我似乎都找不到。我希望有人可能以前做过这件事,并指出我正确的方向。
在此先感谢您的帮助!
更新 1:上面没有提到第三个选项。那就是清除数据库中的所有数据,然后重新插入。我不希望这样做,因为即使使用小型 GTFS 文件,也很容易插入数十万个元素,而且这似乎需要大约半小时才能执行,这意味着如果将其投入生产,就会有很多停机时间更新。