GOOGLE ADS

среда, 27 апреля 2022 г.

Как я могу использовать серверные курсоры с django и psycopg2?

Я пытаюсь использовать курсор на стороне сервера в psycop2, как подробно описано в этом сообщении в блоге. В сущности, это достигается с

from django.db import connection
if connection.connection is None:
cursor = connection.cursor()
# This is required to populate the connection object properly
cursor = connection.connection.cursor(name='gigantic_cursor')

Когда я выполняю запрос:

cursor.execute('SELECT * FROM %s WHERE foreign_id=%s' % (table_name, id))

Я получаю ProgrammingError:

psycopg2.ProgrammingError: can't use a named cursor outside of transactions

Я наивно пытался создать транзакцию, используя

cursor.execute('BEGIN')

перед выполнением SELECTинструкции. Однако это приводит к той же ошибке, сгенерированной из cursor.execute('BEGIN')строки.

Я также пытался использовать

cursor.execute('OPEN gigantic_cursor FOR SELECT * FROM %s WHERE foreign_id=%s' % (table_name, id))

но я получаю те же результаты.

Как мне совершить транзакцию в django?


Решение проблемы

Как вы упомянули в своем вопросе, но я повторю здесь для будущих читателей: также можно использовать явно названные курсоры без обхода общедоступного API Django:

from django.db import connection, transaction
with transaction.atomic(), connection.cursor() as cur:
cur.execute("""
DECLARE mycursor CURSOR FOR
SELECT *
FROM giant_table
""")
while True:
cur.execute("FETCH 1000 FROM mycursor")
chunk = cur.fetchall()
if not chunk:
break
for row in chunk:
process_row(row)

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

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...