2012-06-19 27 views
8

Thông báo lỗi tôi nhận đượcliệu cắt ngắn cho cột 'url' ở hàng 1 - Lỗi với lập trình với Python Django

Traceback (most recent call last): 
    File "./test.py", line 416, in <module> 
    startup() 
    File "./test.py", line 275, in startup 
    writer.save(r,data) 
    File "/home/user/project/test/output.py", line 91, in save 
    self.save_doc(r, data, pid) 
    File "/home/user/project/test/output.py", line 130, in save_doc 
    cursor.execute(dbquery) 
    File "/usr/local/lib/python2.6/site-packages/django/db/backends/util.py", line 34, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "/usr/local/lib/python2.6/site-packages/MySQL_python-1.2.3c1-py2.6-linux-x86_64.egg/MySQLdb/cursors.py", line 175, in execute 
    File "/usr/local/lib/python2.6/site-packages/MySQL_python-1.2.3c1-py2.6-linux-x86_64.egg/MySQLdb/cursors.py", line 89, in _warning_check 
_mysql_exceptions.Warning: Data truncated for column 'url' at row 1 

Điều đầu tiên tôi được kiểm tra là nếu chuỗi URL dài hơn chiều dài lĩnh vực nhưng thực sự ngắn hơn nhiều. Cơ sở dữ liệu Thiết kế

+----------+-------------------------------------------------------------------+ 
| Database | Create Database             | 
+----------+-------------------------------------------------------------------+ 
| myurlcol | CREATE DATABASE `myurlcol` /*!40100 DEFAULT CHARACTER SET utf8 */ | 
+----------+-------------------------------------------------------------------+ 

Table Design

CREATE TABLE `document` (
    `id` int(11) NOT NULL auto_increment, 
    `url` varchar(255) collate utf8_bin NOT NULL, 
    `md5` varchar(32) collate utf8_bin NOT NULL, 
    `host` varchar(255) collate utf8_bin default NULL, 
    `content_sha1` varchar(40) collate utf8_bin NOT NULL, 
    `add_date` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `url` (`url`), 
    UNIQUE KEY `md5` (`md5`), 
    KEY `main_crawl_document_content_sha1` (`content_sha1`), 
    KEY `main_crawl_document_discover_date` (`add_date`), 
    KEY `main_crawl_document_host` (`host`), 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

tôi in ra độ dài của dữ liệu tôi đang cố gắng để chèn vào bảng (Tôi đang thử nghiệm chỉ sử dụng một URL):

len(url) = 89 
len(md5) = 32 
len(host) = 20 
len(content_sha1) = 40 
len(add_date) = 19 

Tôi đã sử dụng con trỏ được tạo bởi Django.db.connection. Để có nhiều thông tin hơn, tôi dán lệnh truy vấn cơ sở dữ liệu hoàn chỉnh tôi truyền cho cursor.execute()

INSERT INTO main_document SET url='ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/0a/39/Arthritis_Res_2000_Jun_5_2%284%29_315-326.tar.gz',md5='b6ba3adde8de87e4dc255092b04d07ea',host='ftp.ncbi.nlm.nih.gov',content_sha1='9aeab4412cc9b1add84a6d2bca574664e193b56e',add_date='2012-05-15 00:00:00'; 

Điều buồn cười là, lệnh trên hoạt động khi tôi sao chép và dán vào dòng lệnh MySQL. Không có thông báo lỗi và dữ liệu vừa được chèn chính xác.

Điều gì đang xảy ra?

+0

Đó là cảnh báo chứ không phải lỗi. –

+0

@Secator nó có thể là một cảnh báo MySQL, nhưng nó trở về như một lỗi Python. Tôi đoán bạn không thể thấy điều đó cho đến khi chỉnh sửa, điều này làm rõ điều đó. – Jordan

+2

Cảm ơn bạn đã để lại bình luận, nhưng đây là câu hỏi của tôi: (1) làm thế nào để loại bỏ những cảnh báo này. (2) nếu tôi phải giữ chúng, làm thế nào để bỏ qua chúng và để dữ liệu được ghi vào cơ sở dữ liệu. Ngay bây giờ, dữ liệu không được ghi vào cơ sở dữ liệu. – fanchyna

Trả lời

0

Bạn nên thử urllib.unquote(url) để unquote chuỗi url trước khi chèn nó vào db. Dấu ký tự dấu%, xuất hiện trong chuỗi của bạn, là special character cho MySQL và có thể làm xáo trộn giao dịch của bạn.

chèn bạn nên đọc:

INSERT INTO main_document SET url='ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/0a/39/Arthritis_Res_2000_Jun_5_2(4)_315-326.tar.gz',md5='b6ba3adde8de87e4dc255092b04d07ea',host='ftp.ncbi.nlm.nih.gov',content_sha1='9aeab4412cc9b1add84a6d2bca574664e193b56e',add_date='2012-05-15 00:00:00'; 

Lưu ý rằng MySQL xử% chỉ như là đặc biệt trong mô hình phù hợp với bối cảnh. Vì vậy, có thể có điều gì đó sai trái với Django ORM ở đây cuối cùng.

+0

Nếu fanchyna đang sử dụng cursor.execute() ký tự '%' không phải là một vấn đề, bởi vì% s sẽ được thay thế trước đó, phải không? – madtyn

1

cursor.execute xử lý thoát MySQL nếu bạn sử dụng chính xác. Some Examples Here

Ý tưởng cơ bản là sử dụng %s trong chuỗi SQL thô, nơi bạn hiện đang bao gồm giá trị thô và sau đó chuyển đối số thứ hai đến cursor.execute() là một bộ (hoặc mảng) của các giá trị theo thứ tự. Trong trường hợp của bạn, trường hợp này sẽ trông giống như:

url = 'ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/0a/39/Arthritis_Res_2000_Jun_5_2%284%29_315-326.tar.gz' 
md5 = 'b6ba3adde8de87e4dc255092b04d07ea' 
host = 'ftp.ncbi.nlm.nih.gov' 
content_sha1 = '9aeab4412cc9b1add84a6d2bca574664e193b56e' 
add_date = '2012-05-15 00:00:00' 
sql = "INSERT INTO main_document SET url = %s, md5 = %s, host = %s, content_sha1 = %s, add_date = %s" 
cursor.execute(sql, (url, md5, host, content_sha1, add_date)) 
+0

Tôi không thấy giá trị "md5" được chỉ định trong cú pháp câu lệnh thực thi. Nó là một lỗi đánh máy? – daemon12

+0

Có, tôi vừa sửa nó để bao gồm md5, cảm ơn! –

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