2009-09-20 32 views
9

Tôi mới sử dụng bộ điều hợp MySQL của Python và Python. Tôi không chắc liệu tôi có thiếu điều gì đó hiển nhiên ở đây không:Python MySQL - CHỌN làm việc chứ không phải DELETE?

db = MySQLdb.connect(# db details omitted) 
cursor = self.db.cursor() 

# WORKS 
cursor.execute("SELECT site_id FROM users WHERE username=%s", (username)) 
record = cursor.fetchone() 

# DOES NOT SEEM TO WORK 
cursor.execute("DELETE FROM users WHERE username=%s", (username)) 

Bất kỳ ý tưởng nào?

+3

gì đặc quyền nào mà bạn có cơ sở dữ liệu? – ennuikiller

+0

đảm bảo rằng người dùng bạn đang sử dụng có quyền xóa hàng. –

+0

Khi bạn nói "KHÔNG ĐƯỢC LÀM VIỆC": làm sao bạn biết? Bạn có nhận được một số loại thông báo lỗi không? Nếu vậy thì cái nào? Vui lòng báo cáo tất cả chi tiết trả trước. –

Trả lời

12

Tôi đoán bạn đang sử dụng công cụ lưu trữ hỗ trợ giao dịch (ví dụ: InnoDB) nhưng bạn không gọi db.commit() sau DELETE. Hiệu ứng của DELETE bị hủy bỏ nếu bạn không cam kết.

Xem http://mysql-python.sourceforge.net/FAQ.html#my-data-disappeared-or-won-t-go-away:

Bắt đầu với 1.2.0, MySQLdb vô hiệu hóa autocommit theo mặc định, theo yêu cầu của tiêu chuẩn DB-API (PEP-249). Nếu bạn đang sử dụng các bảng InnoDB hoặc một số loại bảng giao dịch khác, loại loại bảng giao dịch, bạn cần phải thực hiện connect.commit() trước khi đóng kết nối hoặc không thay đổi nào của bạn được ghi vào cơ sở dữ liệu.

cũng Xem này tương tự như SO câu hỏi: Python MySQLdb update query fails

+0

Bingo! Đây là điều cụ thể của Python mà tôi đang tìm kiếm, bởi vì ở trên có thể đã làm việc trực tiếp lên PHP hoặc Ruby mà không có vấn đề gì. Cảm ơn các bạn! –

+0

đã phá vỡ đầu của tôi với điều này ngày hôm qua ... mất một lúc để tìm ra lý do tại sao. Bạn có nghĩ rằng có một hiệu suất đạt được cam kết tất cả mọi thứ cùng một lúc? tức là, thay vì xóa cho mỗi trường hợp trong vòng lặp for, cam kết ở cuối trước khi đóng? – Cmag

+1

Vâng, chắc chắn có hiệu suất đạt được. Ví dụ, cấu hình mặc định cho InnoDB thực hiện một 'fsync()' sau mỗi giao dịch cam kết. Xem http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit –

0

Để mã của bạn ở trên, chỉ cần thêm một cuộc gọi đến self.db.commit().

Tính năng này rất xa một ít phiền toái:

Nó giúp bạn tiết kiệm từ tham nhũng dữ liệu phát hành khi có những sai sót trong các truy vấn của bạn.

1

Có thể bạn đang vi phạm ràng buộc khóa ngoại.

0

Sự cố có thể là bạn không thực hiện các thay đổi. nó có thể được thực hiện bằng cách conn.commit()

đọc thêm về điều này here

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