This link hiển thị các loại lỗi khác nhau mà bạn có thể nắm bắt. MySQLdb.Error
là lớp cơ sở tiêu chuẩn mà từ đó tất cả các lỗi MySQL khác có nguồn gốc.
Tôi thường sử dụng MySQLdb.Error
vì nó cho phép bạn tập trung vào các lỗi liên quan đến MySQLdb. Ngược lại, StandardError
sẽ bắt hầu như tất cả các ngoại lệ (không phải thứ bạn muốn nếu bạn muốn có khả năng gỡ lỗi tốt hơn). Ngoài việc sử dụng MySQLdb.Error
cho phép bạn hiển thị thông báo lỗi chính xác (số lỗi MySQL và tất cả) để bạn có thể gỡ lỗi nhanh hơn.
Đến phần đầu tiên của câu hỏi, trong trường hợp các câu lệnh cơ sở dữ liệu, thường là cần thiết cho các giao dịch rollback (nếu chúng được hỗ trợ) trong trường hợp có lỗi.
Phương pháp mà tôi theo dõi là bọc mỗi câu lệnh execute
trong mệnh đề thử ngoại trừ (bắt MySQLdb.Error
) và sử dụng khôi phục nếu có lỗi trước khi in thông báo lỗi và thoát.
Tuy nhiên, có sự bắt giữ. Trong MySQLdb những thay đổi mà bạn thực hiện đối với DB là không phải thực sự được ghi vào cơ sở dữ liệu cho đến khi bạn thực hiện cam kết cuộc gọi. Vì vậy, hợp lý, rollback là không cần thiết.
Như một ví dụ,
conn = MySQLdb.connection(db=, host=, passwd=, user=)
cur = conn.cursor()
#Say you have a table X with one entry id = 1 and total = 50
cur.execute("update X set total = 70 where id = 1")
#Actual DB has not yet changed
cur.execute("update X set total = 80 where id = 1")
#Actual DB has still not changed
Nếu bạn thoát khỏi chương trình mà không cần commiting, giá trị trong DB sẽ vẫn là 50 vì bạn không bao giờ được gọi là cam kết().
Đây là cách bạn lý tưởng sẽ làm điều đó:
conn = MySQLdb.connection(db=, host=, passwd=, user=)
cur = conn.cursor()
#Say you have a table X with one entry id = 1 and total = 50
try:
cur.execute("update X set total = 70 where id = 1")
except MySQLdb.Error,e:
print e[0], e[1]
conn.rollback()
cur.close()
conn.close()
#print lengthy error description!!
sys.exit(2)
#Note: Value in table is still 50
#If you do conn.commit() here, value becomes 70 in table too!!
try:
cur.execute("update X set total = 80 where id = 1")
except MySQLdb.Error,e:
print e[0], e[1]
conn.rollback()
cur.close()
conn.close()
#print lengthy error description!!
sys.exit(2)
#Value in DB will be
#a) 50 if you didn't commit anywhere
#b) 70 if you committed after first execute statement
conn.commit()
#Now value in DB is 80!!
cur.close()
conn.close()
tôi sử dụng thậm chí 'StandardError', và bây giờ đang cố gắng để hiểu những gì là chính xác để đảm bảo. – newtover