Pregunta

¿Hay alguna manera de hacer que psycopg y postgres solucionen los errores sin tener que restablecer la conexión, como MySQLdb?La versión comentada de lo siguiente funciona con MySQLdb, los comentarios hacen que funcione 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

Esto debe ralentizar las cosas. ¿Alguien podría dar una sugerencia para pasar por alto los errores de formato?Obviamente, lo anterior se ahoga con los apóstrofes, pero ¿hay alguna manera de pasarlo por alto sin obtener algo como lo siguiente, o comprometerse, volver a conectarse, etc.?:

agreement 19
agreements 1
agrees 1
agrippa 9
choked on agrippa's
choked on agrippina
¿Fue útil?

Solución

En primer lugar, debe dejar que psycopg haga el escape por usted pasando los parámetros al método ejecutar() en lugar de formatear usted mismo con '%'.Eso es:

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

Observe cómo usamos "%s" como marcador incluso para valores que no son cadenas y evitamos las comillas en la consulta.psycopg hará todas las cotizaciones por nosotros.

Luego, si desea ignorar algunos errores, simplemente retroceda y continúe.

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

Eso es todo.psycopg retrocederá e iniciará una nueva transacción en su próximo estado de cuenta.

Otros consejos

Creo que tu código se ve así en este momento:

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

Así que intenta cambiarlo a algo como esto:

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

así que nunca olvides pasar tus parámetros en la lista de parámetros, así no tendrás que preocuparte por tus cotizaciones y demás, también es más seguro.Puedes leer más sobre esto en http://www.python.org/dev/peps/pep-0249/

También eche un vistazo al método .executemany() que está especialmente diseñado para ejecutar la misma declaración varias veces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top