首先,这是我使用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,但我似乎无法获取列,或者找到一种方法只查询特定列(在我的例子中,主键)。 / p>
如果我能找到办法,那么任何一个都应该足够了。
在过去几个小时里看了这两个之后,我似乎也找不到。我希望有人可能以前做过这件事,并指出我正确的方向。
提前感谢您的帮助!
更新1 :上面没有提到第3个选项。这是清除数据库中的所有数据,然后重新插入。我宁愿不这样做,因为即使使用小型GTFS文件,也很容易插入数十万个元素,这似乎需要大约半个小时才能执行,这意味着如果这样可以生产,那么很多停机时间更新。
答案 0 :(得分:1)
使用SQLAlchemy,您只需创建模型类的新实例,并将其合并到当前会话中。 SQLAlchemy将检测它是否已经知道该对象(来自缓存或数据库),并在需要时向数据库添加新行。
newentry = model(chunk)
session.merge(newentry)
另见上下文问题:Fastest way to insert object if it doesn't exist with SQLAlchemy