Tôi muốn ngăn chặn kết nối cơ sở dữ liệu đang mở càng nhiều càng tốt, vì mã này sẽ chạy trên một máy chủ được sử dụng chuyên sâu và những người ở đây đã nói với tôi rằng kết nối cơ sở dữ liệu phải luôn luôn đóng càng sớm càng tốt.Trong Python, làm thế nào để đảm bảo kết nối cơ sở dữ liệu sẽ luôn đóng trước khi rời khỏi một khối mã?
def do_something_that_needs_database():
dbConnection = MySQLdb.connect(host=args['database_host'], user=args['database_user'], passwd=args['database_pass'], db=args['database_tabl'], cursorclass=MySQLdb.cursors.DictCursor)
dbCursor = dbConnection.cursor()
dbCursor.execute('SELECT COUNT(*) total FROM table')
row = dbCursor.fetchone()
if row['total'] == 0:
print 'error: table have no records'
dbCursor.execute('UPDATE table SET field="%s"', whatever_value)
return None
print 'table is ok'
dbCursor.execute('UPDATE table SET field="%s"', another_value)
# a lot more of workflow done here
dbConnection.close()
# even more stuff would come below
Tôi tin rằng để lại kết nối cơ sở dữ liệu mở khi không có hàng trên bàn, tho I'm still really not sure how it works.
Dù sao, có thể đó là thiết kế xấu theo nghĩa là tôi có thể mở và đóng kết nối DB sau mỗi khối nhỏ execute
. Và chắc chắn, tôi chỉ có thể thêm một close
ngay trước khi return
trong trường hợp đó ...
Nhưng làm thế nào có thể tôi luôn luôn đóng đúng DB mà không cần phải lo lắng nếu tôi có mà return
, hoặc một raise
, hoặc continue
, hoặc bất cứ điều gì ở giữa? Tôi đang nghĩ đến trong một cái gì đó giống như một khối mã, tương tự như sử dụng try
, giống như trong những gợi ý sau đây, mà rõ ràng là không hoạt động:
def do_something_that_needs_database():
dbConnection = MySQLdb.connect(host=args['database_host'], user=args['database_user'], passwd=args['database_pass'], db=args['database_tabl'], cursorclass=MySQLdb.cursors.DictCursor)
try:
dbCursor = dbConnection.cursor()
dbCursor.execute('SELECT COUNT(*) total FROM table')
row = dbCursor.fetchone()
if row['total'] == 0:
print 'error: table have no records'
dbCursor.execute('UPDATE table SET field="%s"', whatever_value)
return None
print 'table is ok'
dbCursor.execute('UPDATE table SET field="%s"', another_value)
# again, that same lot of line codes done here
except ExitingCodeBlock:
closeDb(dbConnection)
# still, that "even more stuff" from before would come below
Tôi không nghĩ rằng có bất cứ điều gì tương tự như ExitingCodeBlock
cho một ngoại lệ , tho tôi biết có là thửelse
, nhưng tôi hy vọng Python đã có một tính năng tương tự ...
Hoặc có thể ai đó có thể gợi ý cho tôi một động thái mô hình và cho tôi biết đây là khủng khiếp và đánh giá cao tư vấn cho tôi để không bao giờ làm cái đó. Có lẽ đây chỉ là một cái gì đó để không lo lắng về và để cho MySQLdb xử lý nó, hoặc là nó?
ồ, sau khi bạn và Michael đã chỉnh sửa câu trả lời của bạn, chúng tôi có 2 câu trả lời rất giống nhau và đầy đủ ... khó chọn. – cregox