wie fange ich leere Rückgaben aus Mysql ab?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
funnix
User
Beiträge: 8
Registriert: Donnerstag 21. März 2013, 20:57

Hallo und noch eine Frage...... 8)

Ich habe folgendes Script:

Code: Alles auswählen

import serial
import sys
import time
import MySQLdb
from operator import xor
def sqlread(RFID):
    print "XXXXX id",RFID
    try:
        mysql_opts = {
            'host': "localhost",
            'user': "user", 
            'pass': "pass",
            'db':   "rfid"  
        }       
        mysql = MySQLdb.connect(mysql_opts['host'], mysql_opts['user'], mysql_opts['pass'], mysql_opts['db'])
        mysql.query("SELECT * FROM tags WHERE ID like '%s'" %(RFID))
        result =[]
        result = mysql.use_result()
        print "MySQL version: %s", result.fetch_row()[0][3]

    except mysql.Error, e:
        print "Fehler"
        print "Error %d: %s" % (e.args[0], e.args[1])

    finally:
         if mysql:
                mysql.close()

    return RFID



# UART

ID = ""

Wenn ich eine ID anfrage, die in der DB ist, läuft alles prima. Nur wenn ich eine ID Anfrage, die nicht in der DB ist
bekomme ich

MySQL version: %s
Traceback (most recent call last):
File "./rfid2.py", line 93, in <module>
sqlread(ID[4:10])
File "./rfid2.py", line 27, in sqlread
print "MySQL version: %s", result.fetch_row()[0][3]
IndexError: tuple index out of range
Wie kann ich das verhindern?

Danke schon mal an euch.....

Gruß Funnix
Zuletzt geändert von Anonymous am Donnerstag 21. März 2013, 23:38, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@funnix: Du solltest nur Methoden verwenden die in der DB API 2.0 aufgeführt werden. Das die Standard-API für die es für alle gängigen relationalen Datenbanksysteme (mindestens) eine Implementierung gibt.

Werte sollte man in SQL-Anweisungen nicht per Zeichenkettenformatierung einbauen. Dafür gibt es Platzhalter und das zweite Argument der `execute()`-Methode. Das Datenbankmodul sorgt dann dafür, dass die Werte sicher escaped werden und man sich keine SQL-Injections einfangen kann.

Die Inhalte von ``try`` und ``finally`` passen so nicht. Wenn die Verbindung fehlschlägt, dann wird `mysql` ja gar nicht definiert und dann schlägt natürlich auch das ``if`` im ``finally``-Block mit einem `NameError` fehl.

Zum eigentlichen Problem: Entweder behandelst Du den `IndexError` oder Du prüfst halt ob etwas im Ergebnis vorhanden ist bevor Du darauf zugreifst.
Benutzeravatar
funnix
User
Beiträge: 8
Registriert: Donnerstag 21. März 2013, 20:57

Hallo BlackJack,

erst mal danke für deine Antwort. Ich habe mir den Link mal angesehen, konnt daraus aber jetzt nicht so direkt ableiten, was mein Fehler war. Kannst Du mir das am praktischen Beispiel beschreiben? Wie gesagt ich beschäftige mich erst seit ganz kurzer Zeit mit python...

Danke schon mal...

Gruß Funnix
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

funnix hat geschrieben:Ich habe mir den Link mal angesehen, konnt daraus aber jetzt nicht so direkt ableiten, was mein Fehler war. Kannst Du mir das am praktischen Beispiel beschreiben?
Die Verwendung der Methoden query und use_result ist nicht der vorgesehene Weg. Damit befindest du dich zu dicht an der C API. Besser sind execute und fetchone/fetchmany.

Einige wenige Beispiele findest du unter http://mysql-python.sourceforge.net/MyS ... ml#mysqldb. Die Basis ist aber PEP-249.
Benutzeravatar
funnix
User
Beiträge: 8
Registriert: Donnerstag 21. März 2013, 20:57

So besser ?

Code: Alles auswählen

import MySQLdb
ID="xxxxx"
#ID="0B3FE2"
db=MySQLdb.connect(user="yyyyyy", passwd="xxxxxx",db="rfid")
c=db.cursor()
max_price=5
c.execute("""SELECT * FROM tags
          WHERE ID LIKE %s""", (ID,))
dbvar=c.fetchone()
if dbvar:
    print dbvar
else:
    print " ID nicht vorhanden"


Wenn das so korrekt ist, wie fange ich jetzt einen ggf. Fehler beim SQL Connect ab?

Gruß Funnix
wie kann ich jetzt abfangen
BlackJack

@funnix: Verbindungsfehler führen zu einer Ausnahme, da kann man also ``try``/``except`` für verwenden.
Antworten