2009-06-10 39 views
5

Tôi đang sử dụng Python và mô-đun MySQLdb của nó để nhập một số dữ liệu đo lường vào cơ sở dữ liệu Mysql. Lượng dữ liệu mà chúng tôi có khá cao (hiện tại khoảng ~ 250 MB tệp csv và còn nhiều dữ liệu khác nữa).Python + MySQLdb executemany

Hiện tại tôi sử dụng cursor.execute (...) để nhập một số siêu dữ liệu. Điều này không có vấn đề vì chỉ có một vài mục nhập cho các mục này.

Vấn đề là khi tôi cố gắng sử dụng cursor.executemany() để nhập khẩu số lượng lớn các dữ liệu đo thực tế, MySQLdb đặt ra một

TypeError: not all arguments converted during string formatting 

mã hiện tại của tôi là

def __insert_values(self, values): 
    cursor = self.connection.cursor() 
    cursor.executemany(""" 
     insert into values (ensg, value, sampleid) 
     values (%s, %s, %s)""", values) 
    cursor.close() 

nơi values là danh sách các bộ chứa ba chuỗi. Bất kỳ ý tưởng gì có thể sai với điều này?

Edit:

Các giá trị được tạo ra bởi

yield (prefix + row['id'], row['value'], sample_id) 

và sau đó đọc vào một danh sách một ngàn tại một thời điểm nơi hàng là và iterator đến từ csv.DictReader.

+1

Bạn đã xác minh rằng các giá trị chứa đúng dữ liệu phải không? Ngoài ra, bạn nên xem xét việc sử dụng LOAD DATA INFILE LOCILE. Nó có thể nhanh hơn rất nhiều. –

+0

Vấn đề là dữ liệu cần phải được xử lý trước (hiện đang được thực hiện trong cùng một tập lệnh python) và không thể tạo ra các bản sao dự phòng của các tập dữ liệu lớn như vậy. Các giá trị phải là ok khi tôi kiểm tra với trình gỡ rối. – lhahne

Trả lời

7

Hồi tưởng lại đây thực sự là một khó phát hiện sai lầm. Giá trị là một từ khóa trong sql để các giá trị tên bảng cần báo giá xung quanh nó.

def __insert_values(self, values): 
    cursor = self.connection.cursor() 
    cursor.executemany(""" 
     insert into `values` (ensg, value, sampleid) 
     values (%s, %s, %s)""", values) 
    cursor.close() 
3

Thông báo bạn nhận được cho biết rằng bên trong phương thức executemany(), một trong các chuyển đổi không thành công. Kiểm tra danh sách values của bạn cho một tuple dài hơn 3.

Đối với một kiểm tra nhanh:

max(map(len, values)) 

Nếu kết quả là cao hơn so với 3, xác định vị trí tuple xấu của bạn với một bộ lọc:

[t for t in values if len(t) != 3] 

hoặc, nếu bạn cần chỉ mục:

[(i,t) for i,t in enumerate(values) if len(t) != 3] 
+0

Cảm ơn nhưng đó không phải là vấn đề. Tất cả các bộ dữ liệu đều có độ dài chính xác. – lhahne

+0

Vâng, bây giờ hãy kiểm tra định dạng của bạn có số% s chính xác ... – gimel

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