Exceptions et transactions
Rappel :
Exemple : Duplication de clé
1
#!/usr/bin/python3
2
3
import psycopg2
4
5
conn = psycopg2.connect("host='localhost' dbname='mydb' user='me' password='secret'")
6
cur = conn.cursor()
7
8
sql = "INSERT INTO philosopher VALUES ('Épicure', NULL, -4)"
9
cur.execute(sql)
10
conn.commit()
11
12
sql = "INSERT INTO philosopher VALUES ('Épicure', NULL, -4)"
13
cur.execute(sql)
14
conn.commit()
15
16
print("Fin du programme")
17
18
conn.close()
1
Traceback (most recent call last):
2
File "./sortie1.py", line 18, in <module>
3
cur.execute(sql)
4
psycopg2.IntegrityError: duplicate key value violates unique constraint "philosopher_pkey"
5
DETAIL: Key (surname)=(Épicure) already exists.
Exemple : Duplication de clé (gestion de l'exception)
1
#!/usr/bin/python3
2
3
import psycopg2
4
5
conn = psycopg2.connect("host='localhost' dbname='mydb' user='me' password='secret'")
6
cur = conn.cursor()
7
8
try:
9
sql = "INSERT INTO philosopher VALUES ('Épicure', NULL, -4)"
10
cur.execute(sql)
11
conn.commit()
12
except psycopg2.IntegrityError as e:
13
print("Message système :", e)
14
15
try:
16
sql = "INSERT INTO philosopher VALUES ('Épicure', NULL, -4)"
17
cur.execute(sql)
18
conn.commit()
19
except psycopg2.IntegrityError as e:
20
print("Message système :", e)
21
22
print("Fin du programme")
23
24
conn.close()
1
Message système : duplicate key value violates unique constraint "philosopher_pkey"
2
DETAIL: Key (surname)=(Épicure) already exists.
3
4
Traceback (most recent call last):
5
File "./sortie1.py", line 22, in <module>
6
cur.execute(sql)
7
psycopg2.InternalError: current transaction is aborted, commands ignored until end of transaction block
Attention :
L'erreur de duplication est bien gérée, mais une seconde exception est levée car lors de la seconde insertion, la première transaction est encore en cours, car l'instruction conn.commit()
ne s'est pas exécutée.
Méthode :
On va ajouter un ordre de rollback pour terminer la transaction en cas d'erreur.
Syntaxe : Try/Except
1
try:
2
# code pouvant générer une erreur
3
except type_de_l_erreur as e:
4
# traitements spécifiques
5
print(e) # affichage de l'erreur
6
conn.rollback()
Exemple :
1
#!/usr/bin/python3
2
3
import psycopg2
4
5
conn = psycopg2.connect("host='localhost' dbname='mydb' user='me' password='secret'")
6
cur = conn.cursor()
7
8
try:
9
sql = "INSERT INTO philosopher VALUES ('Épicure', NULL, -4)"
10
cur.execute(sql)
11
conn.commit()
12
except psycopg2.IntegrityError as e:
13
conn.rollback()
14
print("Message système :", e)
15
16
try:
17
sql = "INSERT INTO philosopher VALUES ('Épicure', NULL, -4)"
18
cur.execute(sql)
19
conn.commit()
20
except psycopg2.IntegrityError as e:
21
conn.rollback()
22
print("Message système :", e)
23
24
print("Fin du programme")
25
26
conn.close()