Мне нужно выполнить пакетное обновление, поскольку ORM bulk_update кажется немного медленным для 1000 записей. Поскольку я обновляю строки, которые могут содержать одинарные кавычки, например. Mc'Donald, я не могу просто создать шаблон строковой переменной со всеми атрибутами.
документация рекомендует следующее :
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
Вопрос. Как мне правильно применить это для приведенного ниже варианта использования?
Технические детали:
- Джанго 3.0.2
- PostgreSQL
Я генерирую строку SQL, а затем вызываю ее следующим образом:
from django.db import connection
people = [{"name": "Person A", "age": 15, "height_m": 1.83, "id": 5}, {"name": "Person B", "age": 19, "height_m": 1.73, "id": 45}]
sql = ""
params = []
for p in people:
sql += 'UPDATE people SET name = %s, age = %d, height_m = %d WHERE id = %d;'
params.append(p['name'])
params.append(p['age'])
params.append(p['height_m'])
params.append(p['id'])
with connection.cursor() as cursor:
cursor.execute(sql, params)
cursor.connection.commit()
Это вызывает следующую ошибку:
ValueError: unsupported format character 'd' (0x64) at index 104