2012-05-01 2 views
6

시간을내어 읽어 주셔서 감사합니다. 문제를 설명하기 위해 긴 게시물이 될 것입니다. 나는 모든 일반적인 출처에서 대답을 찾을 수 없었습니다.MySQL 및 Python Select 문 문제

문제 : python에서 select 문을 사용하여 mysql 데이터베이스의 테이블에서 데이터를 회수하는 데 문제가 있습니다.

시스템 및 버전 : 나는 정상적인 MySQL의 쿼리를 통해 원하는

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

있습니다 응답 :

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

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

를 이전과 마찬가지로,이는 여기에

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) 

는 테이블의 예상되는 응답 및 DB 설계 방법에 대해 설명합니다.

내 코드 : 이것은 내가 기대하는 결과를 반환

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] 

:

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

내가 데이터 변경하는 경우 : 데이터를 = 'FF로'나는 다음과 같은 오류가 나타납니다 :

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 

확인. 그래서, 나는 그렇게 나의 SQL 문에 문자를 포맷 문자열을 추가

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

그리고 나는 다음과 같은 응답을 얻을 :

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

을 그리고 0x6700으로해야한다.

% s 문자가있는 데이터를 전달해야한다는 것을 알고 있습니다. 이것이 변수 당 하나의 % s를 사용하여 데이터베이스 테이블을 작성한 방법입니다.

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

모든 문제를 해결하는 방법은 무엇입니까?

감사합니다.

답변

23

실행 진술이 정확하지 않은 것 같습니다. 내 이해는 패턴 cursor.execute(<select statement string>, <tuple>)을 따라야하고 튜플 위치에 하나의 값만 넣으면 실제로는 문자열입니다. 두 번째 인수에 올바른 데이터 유형을 지정하려면 쉼표를 입력해야합니다. 따라서 진술은 다음과 같습니다.

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

굉장! 이것은 내 문제를 해결했다. 감사! – JoshP