запрос на удаление postgres для пакетной обработки с использованием python

#python #postgresql #psycopg2

Вопрос:

Я хочу выполнить массовое удаление в postgres с помощью python, и в моем предложении where есть несколько столбцов для извлечения правильной записи.

Пример: Для одной записи я запустил это удаление продуктов, где идентификатор компании=’123′ и идентификатор продукта=1;

Я пробовал это для нескольких записей, но получил эту ошибку

запрос содержит более одного заполнителя «%s»

 query = delete products where company_id='%s' and product_id=%s; 
values =[(1,2),(3,4)]
psycopg2.extras.execute_values(self.cursor, delete_query, values)
 

Ответ №1:

Я вижу пару проблем с фрагментом, которым вы поделились

  1. синтаксис удаления в postgresql таков delete from <tablename> where ...
  2. company_id кажется строкой, но в значениях он выражается в виде целого числа.

вы можете либо выполнить несколько запросов для удаления записей, либо передать список значений для сравнения с составным полем (company_id, product_id) и использовать execute_values

предполагая, что идентификатор компании-это текст, а ваш список значений содержит строки

несколько запросов:

 stmt = "delete from products where company_id = %s and product_id = %s"
cur.execute('begin')
try:
    for cid, pid in values:
      cur.execute(stmt, (cid, pid))
    cur.execute('commit')
    # do other things
except:
    cur.execute('rollback')
    # do other things to handle this exception
 

один запрос значения execute_values

 from postgresql.extras import execute_values

stmt = "delete from products where (company_id, product_id) IN (%s)"
execute_values(cur, stmt, values)
 

psycopg2.extras Страница документации содержит множество полезных функций, включая документацию для execute_values

Комментарии:

1. Спасибо @haleemur. Я использовал один запрос значения execute_values

Ответ №2:

Вы отправляете каждому %s кортеж вместо одного значения.

Вот как он должен использоваться:

Ссылка: https://www.psycopg.org/docs/extras.html?выделить=uuid

 >>> execute_values(cur,
... """UPDATE test SET v1 = data.v1 FROM (VALUES %s) AS data (id, v1)
... WHERE test.id = data.id""",
... [(1, 20), (4, 50)])
 

Так что в вашем случае это должно быть что-то в этом роде. Посмотрите, как они ссылаются на данные.

     ... """DELETE products USING (VALUES %s) AS data (companyId, productId)
    ... WHERE company_id = data.companyId  and product_id = data.productId """,
    ... [(1, 20), (4, 50)])