Исключения базы данных SQLite
На практике всегда окружайте операции с базой данных выражениями или a context manager:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import sqlite3 #Import the SQLite3 module
try:
# Creates or opens a file called mydb with a SQLite3 DB
db = sqlite3.connect('data/mydb')
# Get a cursor object
cursor = db.cursor()
# Check if table users does not exist and create it
cursor.execute('''CREATE TABLE IF NOT EXISTS
users(id INTEGER PRIMARY KEY, name TEXT, phone TEXT, email TEXT unique, password TEXT)''')
# Commit the change
db.commit()
# Catch the exception
except Exception as e:
# Roll back any change if something goes wrong
db.rollback()
raise e
finally:
# Close the db connection
db.close()
|
В этом примере мы используем выражения try/except/finally для того, что бы поймать любые исключения в коде. Ключевое слово
finally
очень важно потому, что всегда закрывает коннект к базе корректно. О исключениях хорошо описано в PEP249. Итак посмотрим на этот код:
|
# Поймать исключение
except Exception as e:
raise e
|
Это называется ловим все. Используем его здесь для примера, в реальном приложении вы должны поймать и обработать определенные исключения такие как
IntegrityError
или
DatabaseError
.
Мы можем использовать Connection объект как context manager для автоматического запоминания или отката транзакции:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
name1 = 'Andres'
phone1 = '3366858'
email1 = 'user@example.com'
# A very secure password
password1 = '12345'
try:
with db:
db.execute('''INSERT INTO users(name, phone, email, password)
VALUES(?,?,?,?)''', (name1,phone1, email1, password1))
except sqlite3.IntegrityError:
print('Record already exists')
finally:
db.close()
|
В вышеприведенном примере если предложение insert вызывает исключение, транзакция будет откачена и выдано сообщение; в противном случае транзакция будет запомнена в базе. Пожалуйста обратите внимание на то, что мы вызываем метод
execute
объекта
db
а не объекта курсор.
Комментариев нет:
Отправить комментарий