2012-05-01 9 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 

私がデータを変更した場合:

: データ= 'のF-F' 私は、次のエラーが表示されます
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。だから、私はそうと、私のSQL文に文字を書式文字列を追加します。

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

そして私は、次の応答を取得:

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

をし、それが0x6700によって必要があります。

私は1つの%s文字でデータを渡す必要があることを知っています。これは、変数ごとに1%を使用してデータベーステーブルを作成する方法です。

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

これを修正する方法はありますか?

ありがとうございました。

答えて

23

実行文が正しく表示されません。私の理解は、それはパターンcursor.execute(<select statement string>, <tuple>)に従うべきであり、タプルの位置に単一の値だけを置くことによって、実際には文字列になります。 2番目の引数に正しいデータ型を入れるには、コンマを入れる必要があります。

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

驚くばかりです!これは私の問題を解決しました。ありがとう! – JoshP