2016-05-30 13 views
0

[ここに画像の説明を入力してください] [1]私は現在、学校のプロジェクトを作成中です。壁に到達する時間が来ています。MySQLdbデータベースからデータを取得できません

私はRaspberry Pi 3+のUSBポートからデータを取得しようとしています。私はArduino Nanoを接続しており、USBポートを介してPiからその文字列(RFIDカードの10進数のUID番号)をPiに送信しています。ここではすべてうまく動作しますが、文字列(ID)を問題なく印刷できます。カードのIDとデータベースのIDを比較しています。静的な数値(コードの下にコメント)を置くと、データが印刷されます。しかし、私がシリアル回線で試しても、何も起こりません。それはまったくデータを取得しないようです。私のデータベースの見通しは、Pythonコードの下にもあります。 ありがとうございました! !

card_id serial_no LastName FirstName 
    1 | 2136106133 | Hansen | Peter  | 
    2 | 117254270 | Larsen | Thompson | 

ます。#/ usr/bin/envをパイソン

import MySQLdb 
import serial 


ser = serial.Serial('/dev/ttyUSB0',9600) 
db = MySQLdb.connect(host="localhost", # your host, usually localhost 
       user="root",   # your username 
       passwd="root", # your password 
       db="RFID")  # name of the data base 
cur=db.cursor() 

CardID = 0 
LastName = "" 
FirstName = "" 

while True: 
    CardID=ser.readline() 

    print "pweasda" 
    print CardID 
    print "pewpew" 
    # CardID = 117254270 - this works. The problem is that I have many RFID cards/tags with different IDs of course. With this statement it prints everything correctly. 

    cur.execute('SELECT * FROM cards WHERE serial_no=%s',(CardID)) 
    results = cur.fetchall() 
    for row in results: 
     FirstName = row[3] 
     LastName = row [2] 
     serial_no = row [1] 
     card_id = row [0] 
     #print the fetched results 
     print "FirstName=%s,LastName=%s,serial_no=%s,card_id=%s" % \ 
     (FirstName, LastName, serial_no, card_id) 
     db.commit() 
     print "Data committed" 

出力画像(エラーなし):[1]:http://postimg.org/image/jf2doogrv/

+0

あなたのデータベースはMySqlまたはsqliteにありますか? –

+0

私のpythonコードの冒頭にはimport MySQLdbがあります。しかし、私もsqlite3を試してみました。同じ結果 – Smesh

+0

いいえ、上記のコードはmysqlでのみ動作します! –

答えて

0

解決策は次のようになります。

import sqlite3 
conn = sqlite3.connect("users.db")#path to your sqlite db file! 
cursor = conn.cursor() 
CardID=ser.readline().strip() 


sql = "SELECT * FROM cards WHERE serial_no=?" 
cursor.execute(sql, [(CardID)]) 
try: 
    results = cursor.fetchall()[0]# just fetching the first row only, you can loop through all rows here! 
    FirstName = results[3] 
    LastName = results[2] 
    serial_no = results[1] 
    card_id = results[0] 
    print "FirstName=%s,LastName=%s,serial_no=%s,card_id=%s" % \ 
    (FirstName, LastName, serial_no, card_id) 

except IndexError as e: 
    print 'CardID Not Exist'+str(e) 
except Exception as e2: 
    print(str(e2)) 

上記のコードでは、データベースがsqlite DBにあると仮定しており、例外を処理してランタイムを把握できるようにしていますもしあればエラー!

+0

ありがとう、私は今それを試してみましょう。 – Smesh

+0

実際には、あなたのスクリーンショットから、あなたは間違ったCardIDを使用しています。where句ではdbにはないので、最終的にはforループに入りません。そうでなければあなたのコードは正しいです! –

+0

はい、私の悪い - 別のカード。正しいIDではまだ動作しません。それで、私には次の結果が得られます:CardIDが存在しない - 範囲外のインデックス(あなたの解) – Smesh

関連する問題