2015-05-28 32 views
6

Próbuję użyć przekierowania po stronie serwera w psycop2, jak opisano w this blog post. W istocie, jest to osiągane zJak używać kursorów po stronie serwera z django i psycopg2?

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') 

Kiedy wykonać zapytanie:

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

dostaję ProgrammingError:

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

ja naiwnie próbował stworzyć transakcja przy użyciu

cursor.execute('BEGIN') 

przed wykonaniem instrukcji SELECT. Jednak powoduje to ten sam błąd generowany z linii cursor.execute('BEGIN').

Ja również próbowałem przy użyciu

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

ale mam takie same wyniki.

Jak dokonać transakcji w django?

+0

Z komunikatu o błędzie wynika, że ​​kursor znajduje się poza transakcjami . Spróbuj użyć kursorów wewnątrz transakcji. –

Odpowiedz

-1

Spróbuj tego:

from django.db import transaction 

# prepare your cursor here ... 

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

wziąć również do obejrzenia oficjalnych Dokumenty na ten temat: https://docs.djangoproject.com/en/1.8/topics/db/transactions/

+0

To nie tworzy kursora po stronie serwera. –

+0

OSTRZEŻENIE: TO ZAWIERA WTRYSK SQL. Poza tym nie tworzy kursora bocznego SERWERA. – Blubber

0

Kursory powinny być używane wewnątrz transakcji. Musisz zdefiniować transakcję i użyć w niej kursora.

- musisz być w transakcji, aby używać kursorów.

Zaczerpnięte z here.

3

Jak wspomina w swoim pytaniu, ale będę tu powtarzać dla przyszłych czytelników: to również możliwe używać jawnie nazwanych kursorów bez ominięcia publicznego interfejsu 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)