Gestion des erreurs Python Psycopg et des connexions (v MySQLdb)
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
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.