Frage

Gibt es eine Möglichkeit psycopg und Postgres-Deal mit, Fehler zu machen, ohne dass die Verbindung wieder aufzubauen, wie MySQLdb? Die kommentierte Version der folgenden Werke mit MySQLdb, die Kommentare mit psycopg2 funktioniert:

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

Das muss Dinge verlangsamen, könnte jemand einen Vorschlag für die Weitergabe über Formatierungsfehler geben? Offensichtlich sind die oben würgt auf Apostrophe, aber gibt es eine Möglichkeit, es zu machen, übergehen, dass ohne so etwas wie die folgende zu bekommen oder zu begehen, wieder anschließen, etc:

agreement 19
agreements 1
agrees 1
agrippa 9
choked on agrippa's
choked on agrippina
War es hilfreich?

Lösung

Als erstes sollten Sie psycopg tun, um die Flucht für Sie lassen durch die Parameter an die execute () Methode übergeben zu tun, anstatt die Formatierung, sich mit ‚%‘. Das heißt:

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

Beachten Sie, wie wir „% s“ als Marker auch für Nicht-String-Werte und vermeiden Anführungszeichen in der Abfrage verwenden. psycopg wird alles tun, die unter Angabe für uns.

Dann, wenn Sie wollen, einige Fehler ignorieren, nur Rollback und weiter.

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

Das ist alles. psycopg wird eine neue Transaktion auf Ihrer nächste Anweisung Rollback und starten.

Andere Tipps

Ich denke, Ihr Code wie folgt aussieht im Moment:

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

So versucht, es so zu etwas zu ändern:

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

so nie vergessen, Ihre Parameter in der Parameterliste übergeben, dann haben Sie nicht über Ihre Angebote und Sachen zu kümmern, sondern auch sicherer. Sie können weitere Informationen unter http://www.python.org/dev/ Pep / pep-0249 /

hat auch einen Blick gibt es bei der Methode .executemany (), die speziell entwickelt, um die gleiche Anweisung mehrmals auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top