Bạn đang cố gắng sử dụng kết nối làm trình quản lý ngữ cảnh:
with conn:
Đối tượng này không triển khai các phương thức cần thiết để được sử dụng như vậy; nó không phải là trình quản lý ngữ cảnh, vì nó thiếu (ít nhất) __exit__
phương pháp
.
Nếu bạn đang đọc một hướng dẫn hoặc tài liệu sử dụng một khác nhau Thư viện MySQL, hãy lưu ý rằng tính năng này có thể được hỗ trợ bởi một số thư viện, chỉ không phải cái này. Dự án MySQLdb chẳng hạn như hỗ trợ nó.
Đối với cụ thể của bạn trường hợp, bạn thậm chí không cần sử dụng with conn:
dòng ở tất cả; bạn không thực hiện bất kỳ thay đổi nào đối với cơ sở dữ liệu, không cần cam kết ở bất kỳ đâu. Bạn có thể xóa with conn:
dòng (hợp nhất mọi thứ dưới nó một bước). Nếu không, bạn có thể thay thế trình quản lý ngữ cảnh bằng một conn.commit()
thủ công ở nơi khác.
Ngoài ra, bạn có thể tạo trình quản lý ngữ cảnh của riêng mình cho trường hợp sử dụng này, sử dụng @contextlib.contextmanager()
người trang trí
:
from contextlib import contextmanager
@contextmanager
def manage_transaction(conn, *args, **kw):
exc = False
try:
try:
conn.start_transaction(*args, **kw)
yield conn.cursor()
except:
exc = True
conn.rollback()
finally:
if not exc:
conn.commit()
và sử dụng cái này như:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
nơi bạn có thể chuyển thêm đối số cho connection.start_transaction()
gọi
.