Пакетное выделение с помощью SQLAlchemy - PullRequest
2 голосов
/ 13 марта 2010

У меня есть большой набор значений 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. Есть ли способ создать оператор выбора таким образом, чтобы вы предоставили список (в данном случае, «значения»), на который sqlalchemy отвечает записями, которые соответствуют этому списку?
  2. Является ли этот код слишком дорогим при создании объектов select? Есть ли способ создать один оператор выбора, а затем параметризировать во время выполнения?

1 Ответ

3 голосов
/ 13 марта 2010

По первому вопросу, что-то вроде этого, если я правильно понимаю ваш вопрос

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...