Question

Existe-t-il un moyen de faire en sorte que psycopg et postgres traitent les erreurs sans avoir à rétablir la connexion, comme MySQLdb? La version commentée de ce qui suit fonctionne avec MySQLdb, les commentaires le font fonctionner avec 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

Cela doit ralentir les choses. Quelqu'un pourrait-il suggérer de passer outre les erreurs de formatage? Il est évident que ce qui précède étouffe les apostrophes, mais existe-t-il un moyen de le faire passer sans que rien ne se passe, sans commettre, reconnecter, etc.?:

agreement 19
agreements 1
agrees 1
agrippa 9
choked on agrippa's
choked on agrippina
Était-ce utile?

La solution

Tout d'abord, vous devriez laisser psycopg faire l'échappement à votre place en transmettant les paramètres à la méthode execute () au lieu de vous formater vous-même avec '%'. C'est-à-dire:

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

Notez comment nous utilisons "% s " comme marqueur même pour les valeurs non-chaînes et éviter les guillemets dans la requête. psycopg fera toutes les citations pour nous.

Ensuite, si vous souhaitez ignorer certaines erreurs, revenez en arrière et continuez.

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

C'est tout. psycopg va annuler et démarrer une nouvelle transaction sur votre prochain relevé.

Autres conseils

Je pense que votre code ressemble à ceci pour le moment:

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

Essayez donc de le changer en quelque chose comme ceci:

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

afin de ne jamais oublier de passer vos paramètres dans la liste des paramètres, vous n’aurez plus à vous soucier de vos citations et autres choses, c’est aussi plus sûr. Vous pouvez en savoir plus à ce sujet sur http://www.python.org/dev/ peps / pep-0249 /

Jetez également un coup d’œil à la méthode .executemany () spécialement conçue pour exécuter plusieurs fois la même instruction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top