Sqlalchemy сравнивает список с запросом, чтобы обновлять, удалять и добавлять

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

У меня есть список словарей, которые я хотел бы сравнить с таблицей, используя Sqlalchemy.

Я ищу эффективное решение для сравнения таким образом, чтобы я мог разделить результаты на 3 группы:

  • Те, которые находятся в таблице, а не в списке, подлежащем удалению
  • Те, которые находятся как в таблице, так и в списке, подлежащем обновлению
  • Те, которые есть в списке, но не таблица, которую нужно добавить

Это варианты, которые я рассмотрел, но не считаю оптимальными:

  1. Выполните запрос для каждого элемента в списке, обновите / добавьте, где это уместно, затем выполните отрицательный запрос any для тех, кто находится в таблице, а не для списка, подлежащего удалению.

  2. Запрос всего в таблице, затем некоторая реализация «set (query) amp; set (list)» для создания списка соответствия, удаления элементов в списке соответствия из исходного списка и запроса для создания списка добавления и удаления соответственно, используйте этот список для обновления / добавления / удаления

 class Widgets(model):
    name = Column(String)
    quantity = Column(Integer)
  
 |----------------|------------------|
|      name      |     quantity     |
|----------------|------------------|
|      foo       |        2         |
|----------------|------------------|
|      far       |        4         |
|----------------|------------------|
  
 list = [
    {'name': 'foo', 'quantity': 3 },
    {'name': 'bar', 'quantity': 7 }
]

  

Используя приведенный выше пример, foo имеет обновленное количество 3, bar добавляется в таблицу и удаляется.

Ответ №1:

вот как я с этим справлюсь:

Элементы для удаления: select element from TABLE where element not in (list_from_dict)

Элементы для обновления: select element from TABLE where element in (list_from_dict)

Элементы для добавления: list_from_dict result of the select for elements to update