Получить значение 'return'd из оператора executeemany

64
11

Использование Postgresql 9.5 с psycopg2.

Используя "return", я могу получить "id" одной строки, которую я вставляю.

sql = "insert into %s (%s) values (%s) returning id" % (table_name, columns, values_template)        
values = tuple(row_dict[key] for key in keys)
cur.execute(sql, values)
id_new_row = cur.fetchone()[0]

Я надеялся также получить идентификатор последней из многих строк, вставленных с executemany оператора executemany.

cur.executemany(insert_sql , data_dict)
#get id of the last row inserted
id_new_row = cur.fetchone()[0]

Но это вызывает DatabaseError, "никаких результатов для извлечения".

Это просто принципиально невозможная вещь, или я не прихожу к результату правильно?

спросил(а) 2021-01-25T19:47:15+03:00 4 месяца, 2 недели назад
1
Решение
77

Я думаю, что то, что вы пытаетесь сделать, невозможно.

Для начала вы уже находитесь на изворотливой почве, насколько это касается PEP 249. В частности, это говорит об исполнении.

Использование этого метода для операции, которая создает один или несколько наборов результатов, представляет собой неопределенное поведение, и реализация разрешена (но не требуется) для повышения исключения, когда она обнаруживает, что результирующий набор был создан путем вызова операции.

Если вы посмотрите на исходный код psycopg2, вы увидите, что executemany устанавливает флаг no_result. Когда вы отслеживаете это до кода, обрабатывающего запрос, вы можете видеть, что он отбрасывает любые результаты (строки 1582-1595 во время публикации).

ответил(а) 2021-01-25T19:47:15+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема