2012-05-01 23 views
6

Dziękujemy za poświęcenie czasu na przeczytanie tego. To będzie długi post, żeby wyjaśnić problem. Nie byłem w stanie znaleźć odpowiedzi we wszystkich zwykłych źródłach.Wybieranie komunikatów MySQL i Python Wybierz

Problem: Używam instrukcji select z pythonem do wywoływania danych z tabeli w bazie danych mysql.

System i wersje:

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) 

Oto tabela:

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

Oto odpowiedzi, które chcę za pomocą zwykłego zapytania mysql:

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

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

Tak jak poprzednio, są odpowiedzi, które są oczekiwane i jak zaprojektowałem DB.

Mój kod:

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] 

ta zwraca wynik I oczekiwać:

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

Jeśli zmienić dane do: danych = 'ff' I pojawia się następujący błąd:

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. Więc dodam ciąg formatowanie znaków do mojego SQL jako tak:

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

I mam następującą odpowiedź:

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

i powinien przez 0x6700.

Wiem, że powinienem przekazać dane jednemu% s znakowi. Tak zbudowałem swoją tabelę bazy danych, używając jednego% s na zmienną:

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

Jakieś pomysły, jak to naprawić?

Dzięki.

Odpowiedz

23

Twoja instrukcja execute nie wydaje się całkiem poprawna. Rozumiem, że powinien on podążać za wzorcem: cursor.execute(<select statement string>, <tuple>) i umieszczając tylko jedną wartość w lokalizacji krotki, jest to w rzeczywistości tylko ciąg znaków. Aby drugi argument był prawidłowym typem danych, musisz umieścić tam przecinek, tak aby Twoja instrukcja wyglądała następująco:

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

Awesome! To rozwiązało mój problem. Dzięki! – JoshP