2009-06-22 34 views
13

OK. Tôi đã xây dựng ở đây một trình duyệt truy vấn mysql, như navicat. Sử dụng MySQLdb để thực hiện các truy vấn.Truy vấn cập nhật Python MySQLdb không thành công

Đây là phần lạ. Khi tôi chạy truy vấn thông qua chương trình (sử dụng MySQLdb), nó mang lại cho tôi thành công, hàng bị ảnh hưởng = 1, nhưng khi tôi nhìn vào nó trong phpmyadmin, giá trị không thay đổi.

vì vậy trước khi tôi thực hiện truy vấn, tôi in ra, sao chép và dán vào cửa sổ truy vấn của phpmyadmin, nhấn và nó hoạt động. Vì vậy, câu chuyện dài ngắn, cập nhật truy vấn không hoạt động, nhưng khi tôi sao chép và dán vào phpmyadmin, nó hoạt động.

self.tbl.sql.use(self.tbl.database)  # switches to correct database. I've printed this and it uses the corrected db 
if self.tbl.sql.execute(query) == True: 
    print sql_obj.rows_affected()   # returns 1 (since i only do 1 query) 

Và đây là một phần của lớp SQL

def execute(self, query): 

    try: 
     self.cursor.execute(query) 
     return True 
    except MySQLdb.ProgrammingError as error: 
     print "---->SQL Error: %s" % error 
     return False 
    except MySQLdb.IntegrityError as e: 
     print "--->SQL Error: %s" % e  
     return False 

Vì vậy, bất kỳ ý tưởng những gì có thể xảy ra?

+2

cảm ơn bạn cho điều này tôi đã có câu hỏi chính xác – KacieHouser

Trả lời

16

Chỉ cần đoán: Có lẽ mã trong Python đang chạy trong một giao dịch và giao dịch có thể cần phải được cam kết rõ ràng?

Chỉnh sửa: Có một số entry in the MySQLdb FAQ có thể có liên quan.

+2

1: Không có cam kết có nghĩa là thay đổi là vô hình với tất cả mọi người khác. –

+0

Đúng. đây chính là nó. Rất cám ơn! – sqram

19

Tôi tin rằng @Jason Creighton và @ S.Lott là chính xác.

Ít nhất nếu bảng bạn đang cập nhật nằm trên công cụ lưu trữ giao dịch. InnoDB là giao dịch, ISAM thì không.

Bạn phải gọi commit() trên đối tượng kết nối của mình trước khi đóng hoặc bạn phải đặt kết nối thành chế độ tự động. Tôi không chắc chắn làm thế nào bạn làm điều đó cho một kết nối MySQLdb, tôi đoán bạn hoặc là thiết lập một đối số để xây dựng kết nối, hoặc thiết lập một tài sản sau khi tạo đối tượng kết nối.

Cái gì như:

conn = mysql.connection(host, port, autocommit=True) 

# or 
conn = mysql.connection(host, port) 
conn.autocommit(True) 
+0

Ahh tôi hiểu rồi. Vâng, đây là vấn đề. Mặc dù bạn đã đăng câu trả lời trả lời thẳng về phía trước, tôi sẽ phải đánh dấu Jason là người được chấp nhận, như ông đã trả lời đầu tiên, với một liên kết đến giải pháp. Cảm ơn rất nhiều, tôi sẽ cho nó 1+! :) – sqram

+2

Đúng! Đoán thứ hai của bạn là đúng - conn.autocommit (True) hoạt động (mặc dù các cam kết rõ ràng vẫn tốt hơn ;-). –

Các vấn đề liên quan