2012-05-01 15 views
6

Gracias por tomarse el tiempo para leer esto. Va a ser una publicación larga para explicar el problema. No he podido encontrar una respuesta en todas las fuentes habituales.MySQL y problemas de Python Select Statement

Problema: Tengo un problema con el uso de la instrucción select con python para recuperar datos de una tabla en una base de datos mysql.

del sistema y versiones:

Linux ubuntu 2.6.38-14-generiC#58-Ubuntu SMP Tue Mar 27 20:04:55 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux 
Python: 2.7.1+ 
MySql: Server version: 5.1.62-0ubuntu0.11.04.1 (Ubuntu) 

Aquí está la tabla:

mysql> describe hashes; 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| id | varchar(20) | NO | PRI | NULL |  | 
| hash | varbinary(4) | NO | MUL | NULL |  | 
+-------+--------------+------+-----+---------+-------+ 

Aquí están las respuestas que quiero a través de una consulta MySQL normales:

mysql> SELECT id FROM hashes WHERE hash='f'; 
+------+ 
| id | 
+------+ 
| 0x67 | 
+------+ 

mysql> SELECT id FROM hashes WHERE hash='ff'; 
+--------+ 
| id  | 
+--------+ 
| 0x6700 | 
+--------+ 

Como antes, estos son las respuestas que se esperan y cómo diseñé el DB.

Mi código:

import mysql.connector 
from database import login_info 
import sys 
db = mysql.connector.Connect(**login_info) 
cursor = db.cursor() 
data = 'ff' 
cursor.execute("""SELECT 
      * FROM hashes 
      WHERE hash=%s""", 
      (data)) 

rows = cursor.fetchall() 
print rows 
for row in rows: 
     print row[0] 

Esto devuelve el resultado que esperaba:

[(u'0x67', 'f')] 
0x67 

Si cambio de datos a: datos = 'FF' recibo el siguiente error:

Traceback (most recent call last): 
File "test.py", line 11, in <module> 
    (data)) 
    File "/usr/local/lib/python2.7/dist-packages/mysql_connector_python-0.3.2_devel- py2.7.egg/mysql/connector/cursor.py", line 310, in execute 
    "Wrong number of arguments during string formatting") 
mysql.connector.errors.ProgrammingError: Wrong number of arguments during string formatting 

OK. Por lo tanto, añadir un formato de cadenas de caracteres a mi instrucción SQL como modo:

cursor.execute("""SELECT 
      * FROM hashes 
      WHERE hash=%s%s""", 
      (data)) 

Y me da la siguiente respuesta:

[(u'0x665aa6', "f'f")] 
0x665aa6 

y debe por 0x6700.

Sé que debería pasar los datos con un carácter% s. Así es como construí mi tabla de base de datos, usando un% s por variable:

cursor.execute(""" 
INSERT INTO hashes (id, hash) 
VALUES (%s, %s)""", (k, hash)) 

¿Alguna idea de cómo solucionar esto?

Gracias.

Respuesta

23

Su instrucción de ejecución no parece del todo correcta. Según entiendo, debe seguir el patrón cursor.execute(<select statement string>, <tuple>) y al poner solo un valor en la ubicación de la tupla, en realidad es solo una cadena. Para hacer que el segundo argumento sea el tipo de datos correcto, debe poner una coma allí para que su declaración se vea así:

cursor.execute("""SELECT 
      * FROM hashes 
      WHERE hash=%s""", 
      (data,)) 
+0

¡Impresionante! Esto resolvió mi problema. ¡Gracias! – JoshP