2012-06-19 15 views
8

El mensaje de error que me dieron fuedatos truncados para la columna 'url' en la fila 1 - Error con la programación con 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 

Lo primero que me iba a registrar es si la cadena URL es más larga que la longitud del campo , pero en realidad es mucho más corto. diseño de base

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

Diseño Tabla

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; 

imprimo las las longitudes de los datos que estoy tratando de insertar en la tabla (estoy probando el uso de sólo una URL):

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

Estaba usando un cursor creado por Django.db.connection. Para ser más informativo, me pega el comando completa base de datos de consulta pasé a 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'; 

Lo curioso es que, el comando anterior funciona cuando copio y pegado a la línea de comandos de MySQL. No hay mensajes de error y los datos simplemente se insertaron correctamente.

¿Qué está pasando?

+0

Es una advertencia, no es un error. –

+0

@Secator podría ser una advertencia de MySQL, pero está volviendo como un error de Python. Supongo que no podrías ver eso hasta la edición, lo que aclara. – Jordan

+2

Gracias por dejar comentarios, pero estas son mis preguntas: (1) cómo eliminar estas advertencias. (2) si tengo que guardarlos, cómo ignorarlos y dejar que los datos se escriban en la base de datos. En este momento, los datos no están escritos en la base de datos. – fanchyna

Respuesta

0

Debe intentar urllib.unquote(url) para unquote la cadena url antes de insertarla en la base de datos. El marcador del carácter de comillas%, que aparece en la cadena, es special character para MySQL y puede alterar su transacción.

Su inserción debe decir:

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

Tenga en cuenta que MySQL trata% sólo como especial en contextos de coincidencia de patrones. Entonces, puede haber algo mal con Django ORM aquí al final.

+0

Si fanchyna está utilizando cursor.execute() el carácter '%' no debería ser un problema, porque el% s se reemplazaría antes, ¿no? – madtyn

1

cursor.execute maneja el escape de MySQL si lo usa correctamente. Some Examples Here

La idea básica es utilizar %s en la cadena SQL en bruto en el que actualmente está incluyendo los valores brutos, y luego pasar a un segundo argumento a cursor.execute() que es una tupla (o matriz) de los valores en orden. En su caso, esto se vería así:

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

No veo el valor "md5" especificado en la sintaxis de la sentencia de ejecución. ¿Es un error tipográfico? – daemon12

+0

Sí, lo arreglé para incluir md5, ¡gracias! –

Cuestiones relacionadas