使用SQLAlchemy进行批量选择

2 投票
1 回答
4126 浏览
提问于 2025-04-15 20:23

我有一大堆值V,其中一些可能已经存在于一个表T中。我想把那些还没有插入的值放进这个表里。目前我写了以下代码:

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

我感觉这个运行得比我预期的要慢。我有几个相关的问题:

  1. 有没有办法构造一个选择语句,让你提供一个列表(在这个例子中就是'values'),然后sqlalchemy能返回与这个列表匹配的记录?
  2. 这段代码在构造选择对象时是不是太耗资源了?有没有办法先构造一个选择语句,然后在执行时再传入参数?

1 个回答

3

对于第一个问题,如果我理解你的问题没错,可以这样做:

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

对于第二个问题,一次只查询一行确实太浪费资源了,尽管有时候你可能别无选择。据我所知,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

撰写回答