在SQLAlchemy中选择主键对象列表

时间:2012-09-16 20:29:02

标签: python sqlalchemy

首先,这是我使用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,但我似乎无法获取列,或者找到一种方法只查询特定列(在我的例子中,主键)。 / p>

  3. 如果我能找到办法,那么任何一个都应该足够了。

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

    提前感谢您的帮助!

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

1 个答案:

答案 0 :(得分:1)

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

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

另见上下文问题:Fastest way to insert object if it doesn't exist with SQLAlchemy