2010-07-09 39 views
6

Trong python, tôi đang điền một cơ sở dữ liệu SQLITE bằng cách sử dụng importmany, vì vậy tôi có thể nhập hàng chục nghìn hàng dữ liệu cùng một lúc. Dữ liệu của tôi được chứa dưới dạng danh sách các bộ dữ liệu. Tôi đã thiết lập cơ sở dữ liệu của mình với các khóa chính mà tôi muốn chúng.Tiếp tục tải sau khi IntegrityError

Sự cố mà tôi gặp phải là các lỗi khóa chính sẽ ném lên một IntegrityError. Nếu tôi xử lý ngoại lệ, tập lệnh của tôi sẽ dừng nhập tại xung đột khóa chính.
thử:

try: 
    self.curs.executemany("INSERT into towers values (NULL,?,?,?,?)",self.insertList) 
except IntegrityError: 
    print "Primary key error" 
conn.commit() 


Vì vậy, câu hỏi của tôi là, trong python sử dụng importmany thể I:

1. Capture các giá trị vi phạm các khóa chính?
2. Tiếp tục tải dữ liệu sau khi tôi nhận được các lỗi chính chính của mình.

Tôi nhận được lý do tại sao nó không tiếp tục tải, bởi vì sau khi ngoại lệ, tôi cam kết dữ liệu vào cơ sở dữ liệu. Tôi không biết làm thế nào để tiếp tục nơi tôi rời đi tuy nhiên.

Unforutnley Tôi không thể sao chép và dán tất cả mã trên mạng này, mọi trợ giúp sẽ được đánh giá cao. Ngay bây giờ tôi không có PKS thiết lập như là một công trình xung quanh ...

Trả lời

0

Sử dụng vòng lặp for để lặp qua danh sách và sử dụng thực thi thay vì thực thi. Quanh vòng lặp for với thử của bạn và tiếp tục thực hiện sau một ngoại lệ. Một cái gì đó như thế này:

for it in self.insertList: 
    try: 
     self.curs.execute("INSERT into towers values (NULL,?,?,?,?)",it) 
    except IntegrityError: 
     #here you could insert the itens that were rejected in a temporary table 
     #without constraints for later use (question 1) 
     pass 
conn.commit() 

Bạn thậm chí có thể đếm số lượng mục trong danh sách đã được chèn vào thực tế.

+0

Như tôi đã hiểu, 'executemany' tồn tại vì nó cung cấp một sự gia tăng đáng kể về tốc độ so với các lệnh' execute' được lặp lại python. Vì vậy, giải pháp của bạn, trong khi nó sẽ làm việc, sẽ làm chậm một nhập dữ liệu rất lớn đáng kể. Một giải pháp sẽ là theo dõi các khóa chính đã được thêm vào trong một bộ python và lọc insertList trước thời hạn trước khi đưa nó vào con trỏ. –

+0

@PeterMcMahan OK Tôi đồng ý. Đó không phải là mã hiệu quả. Nó chỉ "hoạt động" như bạn đã nói. – jheyse

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