2012-06-19 6 views
8

Die Fehlermeldung, die ich bekam, warabgeschnitten Daten für Spalte ‚url‘ in Zeile 1 - Fehler bei der Programmierung mit 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 

Das erste, was ich war die Überprüfung, wenn die URL-Zeichenfolge ist länger als die Feldlänge , aber es ist tatsächlich viel kürzer. Datenbank-Design

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

Tisch 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; 

ich die die Längen der Daten auszudrucken ich in die Tabelle einzufügen versuchen (Ich teste nur eine URL):

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

Ich benutzte einen Cursor von Django.db.connection erstellt. Um informative, füge ich den kompletten Datenbank-Abfragebefehl I cursor.execute() geben

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'; 

Das Komische ist, dass der Befehl oben funktioniert, wenn ich kopiere und mit der MySQL-Kommandozeile eingefügt. Keine Fehlermeldungen und die Daten werden nur korrekt eingefügt.

Was läuft falsch?

+0

Es ist eine Warnung, kein Fehler. –

+0

@Secator es könnte eine MySQL-Warnung sein, aber es kommt als Python-Fehler zurück. Ich nehme an, du konntest das erst beim Editieren sehen, was das aufräumt. – Jordan

+2

Vielen Dank für Ihre Kommentare, aber hier sind meine Fragen: (1) wie Sie diese Warnungen entfernen. (2) wenn ich sie behalten muss, wie man sie ignoriert und die Daten in die Datenbank schreibt. Momentan werden die Daten nicht in die Datenbank geschrieben. – fanchyna

Antwort

0

Sie sollten versuchen urllib.unquote(url) um unquote die URL-Zeichenfolge vor dem Einfügen in die db. Der Anführungszeichenmarker%, der in Ihrer Zeichenfolge vorkommt, ist ein special character für MySQL und kann Ihre Transaktion beeinträchtigen.

Ihr Einsatz sollte lauten:

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'; 

Beachten Sie, dass MySQL behandelt% nur als Sondermüll in Pattern-Matching-Kontexten. Also könnte am Ende etwas mit Django ORM nicht stimmen.

+0

Wenn fanchyna cursor.execute() verwendet, sollte das '%' Zeichen kein Problem sein, weil% s vorher ersetzt werden würde, oder? – madtyn

1

cursor.execute verarbeitet MySQL, wenn Sie es korrekt verwenden. Some Examples Here

Die Grundidee ist %s im rohen SQL-Zeichenfolge zu verwenden, in denen man zur Zeit der Rohwerte werden, einschließlich, und dann ein zweites Argument cursor.execute() Pass, der ein Tupel (oder Array) des Wertes um. In Ihrem Fall würde dies wie folgt aussehen:

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

Ich sehe "md5" -Wert nicht in der Syntax der Ausführungsanweisung angegeben. Ist es ein Tippfehler? – daemon12

+0

Ja, ich habe es gerade repariert, um MD5 einzuschließen, danke! –

Verwandte Themen