6

これをお読みいただきありがとうございます。問題を説明するのは長い投稿になるでしょう。私はすべての通常の情報源で答えを見つけることができませんでした。

問題:Pythonでselectステートメントを使用してmysqlデータベースのテーブルからデータを呼び出す際に問題が発生します。

システムとバージョン:

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)

表は次のとおりです。

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

通常のmysqlクエリを介して必要な応答は次のとおりです。

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

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

以前と同様に、これらは予想される応答であり、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

データを:data ='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までにあるはずです。

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

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

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

ありがとう。

4

1 に答える 1

23

あなたのexecuteステートメントは完全に正しくないようです。私の理解では、パターンに従う必要があり cursor.execute( <select statement string>, <tuple>)、タプルの場所に1つの値のみを配置することで、実際には単なる文字列になります。2番目の引数を正しいデータ型にするには、そこにコンマを入れる必要があるため、ステートメントは次のようになります。

cursor.execute("""SELECT
            * FROM hashes
            WHERE hash=%s""",
            (data, ))
于 2012-05-01T18:18:14.697 に答える