2010-03-13 31 views
2

我有一大组值V,其中一些可能存在于表T中。我想在表中插入那些尚未插入的值。到目前为止,我的代码是:使用SQLAlchemy批量选择

for value in values: 
     s = self.conn.execute(mytable.__table__.select(mytable.value == value)).first()  
     if not s: 
      to_insert.append(value) 

我觉得这样的运行速度比应该慢。我有几个相关的问题:

  1. 有没有一种方法来构建一个select语句,这样你提供一个列表(在这种情况下,“价值”),其与SQLAlchemy的匹配列表,它记录的响应?
  2. 这段代码在构造select对象时过于昂贵吗?有没有办法构造单个select语句,然后在执行时进行参数化?

回答

2

对于第一个问题,这样的事情,如果我明白你的问题正确

mytable.__table__.select(mytable.value.in_(values) 

对于第二个问题,在时间1行查询,这是过于昂贵的确,虽然你可能没有在这件事上的选择。据我所知,在SQLAlchemy中没有元组选择支持,所以如果有多个变量(认为多元的键)比SQLAlchemy不能帮助你。

无论哪种方式,如果你选择的所有匹配行,并插入你应该做的差:) 像这样的东西应该工作:

results = self.conn.execute(mytable.__table__.select(mytable.value.in_(values)) 
available_values = set(row.value for row in results) 
to_insert = set(values) - available_values 
+0

嗯,我喜欢这个主意;一个问题是,我认为价值太大,最大限度地减少了这种说法。我需要制作一张中间桌子吗? – muckabout 2010-03-13 15:14:57

+0

如果数据来自数据库,那么您可以在数据库中完全执行该操作。但是,如果没有,您可以通过切片值列表轻松地对每1000个项目进行批量处理。:)不需要从本地已有的东西创建临时表。 – Wolph 2010-03-13 15:20:38

+0

好点,那有效! – muckabout 2010-03-13 16:54:37