2012-05-01 41 views
6

Cảm ơn bạn đã dành thời gian đọc nội dung này. Nó sẽ là một bài viết dài để giải thích vấn đề. Tôi đã không thể tìm thấy câu trả lời trong tất cả các nguồn thông thường.MySQL và Python Chọn các vấn đề về Tuyên bố

Sự cố: Tôi đang gặp vấn đề với việc sử dụng câu lệnh chọn với python để thu hồi dữ liệu từ bảng trong cơ sở dữ liệu mysql.

hệ thống và các phiên bản:

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) 

Dưới đây là bảng:

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

Dưới đây là câu trả lời mà tôi muốn thông qua một truy vấn mysql bình thường:

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

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

Như trước đây, đây là những các phản hồi được mong đợi và cách tôi thiết kế DB.

Mã của tôi:

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] 

này trả về kết quả tôi mong đợi:

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

Nếu tôi thay đổi dữ liệu: data = 'ff' tôi nhận được lỗi sau:

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. Vì vậy, tôi thêm một chuỗi định dạng nhân vật để câu lệnh SQL của tôi như vậy:

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

Và tôi nhận được câu trả lời sau đây:

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

và nó nên bởi 0x6700.

Tôi biết rằng tôi phải chuyển dữ liệu với một ký tự% s. Đó là cách tôi xây dựng bảng cơ sở dữ liệu của mình, sử dụng một% s cho mỗi biến:

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

Bất kỳ ý tưởng nào để sửa lỗi này?

Cảm ơn.

Trả lời

23

Câu lệnh thực thi của bạn có vẻ không chính xác. Sự hiểu biết của tôi là nó nên làm theo các mô hình cursor.execute(<select statement string>, <tuple>) và bằng cách đặt chỉ có một giá trị duy nhất trong vị trí tuple nó thực sự chỉ là một chuỗi. Để đặt đối số thứ hai là loại dữ liệu chính xác, bạn cần đặt dấu phẩy vào đó, vì vậy câu lệnh của bạn sẽ trông giống như:

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

Tuyệt vời! Điều này giải quyết được vấn đề của tôi. Cảm ơn! – JoshP

Các vấn đề liên quan