2011-03-11 41 views
11

Tôi gặp sự cố khi tải tệp CSV vào cơ sở dữ liệu mysql. Đây là mã của tôi:LoạiError: không phải tất cả các đối số được chuyển đổi trong khi định dạng chuỗi

for q in csvReader: 
    name, price, LastUpdate, today = q 
    co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(name, price, LastUpdate);""",q) 

Tôi gặp lỗi khi nói TypeError: không phải tất cả đối số được chuyển đổi trong khi định dạng chuỗi.

Cột tên là một chuỗi, giá là một phao và LastUpdate là một ngày. Tôi đọc một chút và thấy một số kịch bản bao bọc các giá trị trong% (value) s và% (value) d (trong trường hợp của tôi thay vì d tôi sử dụng f) nhưng sau đó tôi nhận được một lỗi khác:

TypeError: format yêu cầu ánh xạ

Có ai có thể giúp tôi cho tôi biết tôi đang làm gì sai không?

Cảm ơn bạn!

+0

Bạn đang sử dụng thư viện mysql nào? – chmullig

+0

Trong python Tôi đang sử dụng MySQLdb – Lostsoul

Trả lời

14

Nếu tôi nhớ chính xác, bạn nên sử dụng %s với MySQLdb trong truy vấn để biểu thị các vị trí bạn muốn các phần tử đối số tham chiếu được định dạng. Điều này khác với các trình giữ chỗ thông thường ? được sử dụng trong hầu hết các triển khai khác.

for q in csvReader: 
    name, price, LastUpdate, today = q 
    co.execute("INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %s, %s);",q) 

EDIT: Đây cũng là ví dụ về chèn nhiều hàng cùng một lúc, hiệu quả hơn chèn từng hàng một. Từ MySQLdb User's Guide:

c.executemany(
     """INSERT INTO breakfast (name, spam, eggs, sausage, price) 
     VALUES (%s, %s, %s, %s, %s)""", 
     [ 
     ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95), 
     ("Not So Much Spam Plate", 3, 2, 0, 3.95), 
     ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95) 
     ]) 

Here we are inserting three rows of five values. Notice that there is a mix of types (strings, ints, floats) though we still only use %s. And also note that we only included format strings for one row. MySQLdb picks those out and duplicates them for each row.

+0

Cảm ơn Timo. Tôi đã thử mã đầu tiên bạn đăng (câu lệnh for) và vẫn gặp lỗi này: TypeError: không phải tất cả các đối số được chuyển đổi trong khi định dạng chuỗi Tôi nghĩ rằng tôi cần một vòng lặp vì tôi cần lập trình thêm một số logic vào kịch bản của tôi (tức là thay đổi tên cho mã id, v.v.). Tôi không biết nếu nó giúp nhưng đây là mã hơn: co = db.cursor() dataFile = file ("fund.csv", "rb") csvReader = csv.reader (dataFile) – Lostsoul

+0

Xin lỗi vì trả lời muộn, nhưng bạn có thể thử loại bỏ các chuỗi định danh nguyên văn (dấu ngoặc kép) và thử xem có sửa lỗi không. – Timo

+0

Bạn nên sử dụng? thay vì% s để chèn giá trị nội bộ của cơ sở dữ liệu –

1

định dạng yêu cầu ánh xạ là vì bạn đang đặt tên thành mã thông báo thay thế chuỗi và từ điển được mong đợi.

nếu bạn để lại cho họ tính theo% s% d% f, vv với các dấu ngoặc đơn, nó sẽ đưa các đối số theo thứ tự từ một danh sách hoặc tuple (q)

for q in csvReader: 
    co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %f, %s);""",q[:-1]) 
5

từ các thông báo lỗi, phương pháp execute() được thay thế các thông số của bạn vào câu lệnh SQL của bạn sử dụng %. Nhưng bạn đã không chỉ ra nơi mà bất kỳ của chúng đi, vì vậy không có tham số của bạn đang được sử dụng, tất cả họ còn lại, và do đó bạn nhận được thông báo về việc có một số còn lại (hey, tất cả là một số!). Đọc tài liệu cho trình điều khiển cơ sở dữ liệu của bạn để tìm hiểu những gì nó muốn bạn sử dụng làm mã thông báo thay thế; có lẽ là %s.

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