Пользовательские параметры SQL для подключения к базе данных Django

Мне нужно выполнить пакетное обновление, поскольку 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

person Werner    schedule 07.10.2020    source источник
comment
для какого столбца вы получаете эту ошибку?   -  person Tony Montana    schedule 07.10.2020


Ответы (1)


Для запросов SQL в Python всегда используйте %s в качестве заполнителя, даже для целых чисел.

sql += 'UPDATE people SET name = %s, age = %s, height_m = %s WHERE id = %s;'

Обратите внимание, что для нескольких операторов ответ может зависеть от того, какую базу данных вы используете (например, этот ответ для MySQL).

person Alasdair    schedule 07.10.2020