2012-01-26 36 views
8

tôi có mã này:Làm cách nào để kiểm tra xem chèn đã thành công với MySQLdb bằng Python?

cursor = conn.cursor() 
cursor.execute(("insert into new_files (videos_id, filename, " 
       "is_processing) values (%s,%s,1)"), (id, filename)) 
logging.warn("%d", cursor.rowcount) 
if (cursor.rowcount == 1): 
    logging.info("inserted values %d, %s", id, filename) 
else: 
    logging.warn("failed to insert values %d, %s", id, filename) 
cursor.close() 

Fun như nó có, cursor.rowcountluôn một, mặc dù tôi cập nhật cơ sở dữ liệu của tôi để làm cho videos_id một khóa duy nhất. Đó là, chèn không thành công bởi vì trong các thử nghiệm của tôi giống nhau videos_id sẽ xuất hiện (và khi tôi kiểm tra cơ sở dữ liệu, không có gì được chèn vào). Nhưng vì lý do gì, các rowcount luôn là 1 - ngay cả những logging.warn Tôi có spits ra một rowcount của 1.

Vì vậy, câu hỏi:
Tôi có thể sử dụng để làm việc rowcount ra nếu một chèn diễn ra tốt đẹp? Nếu vậy, tôi (có lẽ) đang làm gì sai? nếu không, làm cách nào để kiểm tra xem có chèn không?

Trả lời

22

Mã của bạn không cam kết sau khi sửa đổi (sửa đổi của bạn được khôi phục). Đó là bạn nên thêm dòng sau đây sau khi cursor.execute:

conn.commit() 

Không chèn sẽ ném MySQLdb.IntegrityError, vì vậy bạn phải sẵn sàng để nắm bắt nó.

Do đó, mã của bạn sẽ giống như:

sql_insert = """insert into new_files (videos_id, filename, is_processing) 
values (%s,%s,1)""" 

cursor = conn.cursor() 
try: 
    affected_count = cursor.execute(sql_insert, (id, filename)) 
    conn.commit() 
    logging.warn("%d", affected_count) 
    logging.info("inserted values %d, %s", id, filename) 
except MySQLdb.IntegrityError: 
    logging.warn("failed to insert values %d, %s", id, filename) 
finally: 
    cursor.close() 
+0

Bạn là nhà vô địch, cảm ơn – bharal

+1

Câu hỏi. Điều gì xảy ra nếu bạn chèn 500 bản ghi tại một thời điểm trước khi cam kết (hoặc bởi một truy vấn dài hoặc nhiều phần chèn rời)? tức là tôi chỉ cam kết mỗi 500 hồ sơ; nếu một trong những bản ghi đó không thành công thì làm cách nào để tôi in chỉ một bản ghi đó và tiếp tục chèn các bản ghi khác. – gunslingor

+0

@ user3656612 nó phụ thuộc vào lý do tại sao chúng không thành công. Nếu vấn đề là phá vỡ một số ràng buộc, bạn có thể sử dụng INSERT IGNORE hoặc INSERT ... ON UPDATE DUPLICATE KEY. Nếu đó là lỗi kết nối, bạn không thể làm gì cả. Nếu đó là lỗi cú pháp - bạn nên xem xét sửa lỗi trong ứng dụng của mình. – newtover

1

Nếu chèn không thành công, bạn sẽ nhận được một ngoại lệ lớn lên hoặc ai đó sẽ hét lên hoặc bạn sẽ rơi khỏi ghế của bạn.

+0

Tôi ghét nó khi tôi rơi khỏi ghế. –

+0

là có một cách thanh lịch để lập trình bắt tất cả ba khả năng? – bharal

+1

thử: Một cái gì đó: ngoại trừ Ngoại lệ, e: in "nó không thành công", str (e) - vì vậy chỉ cần đặt bất cứ điều gì bạn muốn nơi 'Cái gì' là. – synthesizerpatel

1

Cách sử dụng khối try/catch thay vì xem hàng đếm. Nếu nó bắt một ngoại lệ thì có một vấn đề; nếu không, không sao cả.

+0

Tôi kinda mới để python (và mysqldb), bất kỳ cơ hội bạn có thể splurge trên một ví dụ - tức là những gì ngoại lệ để tôi bắt trong khối catch thử? – bharal

2

tôi không có đủ uy tín để thực hiện một bình luận, nhưng đây là một lưu ý quan trọng:

Nó cũng có thể cho thực hiện() để không âm thầm nếu bạn không cam kết sau cuộc gọi. Cụ thể, các bảng MyISAM không yêu cầu cam kết, nhưng các bảng InnoDB thực hiện.

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