Domanda

Esiste un modo per fare in modo che psycopg e postgres gestiscano gli errori senza dover ristabilire la connessione, come MySQLdb?La versione commentata di seguito funziona con MySQLdb, i commenti lo fanno funzionare con Psycopg2:

results = {'felicitas': 3, 'volumes': 8, 'acillevs': 1, 'mosaics': 13, 'perat\xe9': 1, 'representative': 6....}
for item in sorted(results):
    try:
        cur.execute("""insert into resultstab values ('%s', %d)""" % (item, results[item]))
        print item, results[item]
#       conn.commit()
    except:
#       conn=psycopg2.connect(user='bvm', database='wdb', password='redacted')
#       cur=conn.cursor()
        print 'choked on', item
        continue

Questo deve rallentare le cose, qualcuno potrebbe dare un suggerimento per superare gli errori di formattazione?Ovviamente quanto sopra si strozza con gli apostrofi, ma c'è un modo per farlo passare senza ottenere qualcosa di simile a quanto segue, o impegnarsi, riconnettersi, ecc?:

agreement 19
agreements 1
agrees 1
agrippa 9
choked on agrippa's
choked on agrippina
È stato utile?

Soluzione

Prima di tutto dovresti lasciare che psycopg esegua l'escape per te passando i parametri al metodoexecute() invece di eseguire tu stesso la formattazione con '%'.Questo è:

cur.execute("insert into resultstab values (%s, %s)", (item, results[item]))

Nota come utilizziamo "%s" come indicatore anche per valori non stringa ed evitiamo le virgolette nella query.psycopg farà tutti i preventivi per noi.

Quindi, se vuoi ignorare alcuni errori, esegui il rollback e continua.

try:
    cur.execute("SELECT this is an error")
except:
    conn.rollback()

È tutto.psycopg eseguirà il rollback e avvierà una nuova transazione sul tuo prossimo estratto conto.

Altri suggerimenti

Penso che il tuo codice sia così al momento:

l = "a very long ... text".split()
for e in l:
    cursor.execute("INSERT INTO yourtable (yourcol) VALUES ('" + e + "')")

Quindi prova a cambiarlo in qualcosa del genere:

l = "a very long ... text".split()
for e in l:
    cursor.execute("INSERT INTO yourtable (yourcol) VALUES (%s)", (e,))

quindi non dimenticare mai di passare i tuoi parametri nell'elenco dei parametri, quindi non devi preoccuparti delle tue quotazioni e cose del genere, è anche più sicuro.Puoi leggere di più a riguardo su http://www.python.org/dev/peps/pep-0249/

dai un'occhiata anche al metodo .executemany() che è appositamente progettato per eseguire la stessa istruzione più volte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top