#python #sqlalchemy
#python #sqlalchemy
Вопрос:
У меня есть список словарей, которые я хотел бы сравнить с таблицей, используя Sqlalchemy.
Я ищу эффективное решение для сравнения таким образом, чтобы я мог разделить результаты на 3 группы:
- Те, которые находятся в таблице, а не в списке, подлежащем удалению
- Те, которые находятся как в таблице, так и в списке, подлежащем обновлению
- Те, которые есть в списке, но не таблица, которую нужно добавить
Это варианты, которые я рассмотрел, но не считаю оптимальными:
-
Выполните запрос для каждого элемента в списке, обновите / добавьте, где это уместно, затем выполните отрицательный запрос any для тех, кто находится в таблице, а не для списка, подлежащего удалению.
-
Запрос всего в таблице, затем некоторая реализация «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