OOP Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
de_master
User
Beiträge: 72
Registriert: Samstag 15. Januar 2005, 15:19

Hallo,
ich habe folgendes Problem, beim Aufruf meiner Klasse bekomme ich folgende Fehlermeldung:


Traceback (most recent call last):
File "E:\Python\mysql.py", line 119, in -toplevel-
status = test.MySQLdbAddLog("lnfdgkjghn")
File "E:\Python\mysql.py", line 103, in MySQLdbAddLog
self.db.query(sql)
ProgrammingError: (1146, "Table 'test.t_log' doesn't exist")


Der Ausschnitt des Quellcodes sieht wie folgt aus:

Code: Alles auswählen

class MyMySQLdb:

    def __init__(self):
        #self.db = MySQLdb.connect(host="192.168.0.3",user="openEMS", passwd="openEMS",db="openEMS")
        self.db = MySQLdb.connect(host="192.168.25.171",user="test", passwd="test",db="test")

    def MySQLdbAddLog(self, text):
        #Baue Datum und Uhrzeit zusammen
        datumAll = time.strftime('%X %x')
        datum = datumAll[12:14] + "." + datumAll[9:11] + "." + datumAll[15:17]
        timeAll = time.strftime('%H %M')
        zeit = timeAll[0:2] + "." + timeAll[3:5]
        sql1 =  "INSERT INTO t_log (text, datum, zeit) VALUES"
        sql2= "('" + text + "', '" + datum + "', '" + zeit + "')"
        sql = sql1 + sql2
        self.db.query(sql)
        #return 13

test = MyMySQLdb()
status = test.MySQLdbAddLog("lnfdgkjghn")
print status
Könnt ihr mir sagen was ich falsch mache? Die Tabelle existiert in der Tabelle. Ist im prinzip von meinen anderen MySQL Funktionen kopiert.
Mich iritiert in der Fehlermeldung, warum steht da "Table 'test.t_log' doesn't exist" ?

Michael
Benutzeravatar
SigMA
User
Beiträge: 181
Registriert: Sonntag 4. April 2004, 13:27
Wohnort: Freiburg
Kontaktdaten:

*fg* Diese Fehlermeldung hatte ich erst heute ^^

Es bedeutet ganz einfach, das diese Tabelle nicht existiert ^^

vllt. hat auch einfach der User keinen Zugriff auf die Tabelle

SigMA
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
BlackJack

de_master hat geschrieben:Der Ausschnitt des Quellcodes sieht wie folgt aus:

Code: Alles auswählen

class MyMySQLdb:

    def __init__(self):
        #self.db = MySQLdb.connect(host="192.168.0.3",user="openEMS", passwd="openEMS",db="openEMS")
        self.db = MySQLdb.connect(host="192.168.25.171",user="test", passwd="test",db="test")

    def MySQLdbAddLog(self, text):
        #Baue Datum und Uhrzeit zusammen
        datumAll = time.strftime('%X %x')
        datum = datumAll[12:14] + "." + datumAll[9:11] + "." + datumAll[15:17]
        timeAll = time.strftime('%H %M')
        zeit = timeAll[0:2] + "." + timeAll[3:5]
        sql1 =  "INSERT INTO t_log (text, datum, zeit) VALUES"
        sql2= "('" + text + "', '" + datum + "', '" + zeit + "')"
        sql = sql1 + sql2
        self.db.query(sql)
Warum benutzt Du `time.strftime()` nicht gleich richtig um Deine Zeichenketten so zu formatieren, wie Du das gerne hättest? Insbesondere '%X %x' ist keine gute Idee, weil die Darstellung dann davon abhängt was für eine `locale` auf dem Rechner eingestellt ist, auf der das Programm dann läuft. Die Amis haben zum Beispiel "komische" Auffassungen davon wie man eine Zeit und ein Datum anzeigt. Da könnte dann zum Beispiel '12:43:03 a.m. 05/21/06' herauskommen und da stimmen Deine slices so gar nicht mehr.

Ein weiteres Problem ist, dass Du für Datum und Zeit die aktuelle Zeit zweimal vom System abfragst. Wenn das genau um Mitternacht herum passiert, dann kann es passieren, dass das Datum vor Mitternacht abgefragt wird und die Zeit danach, was dann einen um ca. 24 Stunden falschen Eintrag in die Datenbank zur Folge hat.

Und zu guter letzt benutzt Du eine Methode (`query()`) die nicht Bestandteil der DB API 2 ist und formatierst die Werte selbst in die SQL Abfrage. Das sollte man das Datenbankmodul erledigen lassen. Stichwort "SQL-Injection".

Der Quelltext könnte dann ungefähr so aussehen (ungetestet):

Code: Alles auswählen

    def MySQLdbAddLog(self, text):
        now = localtime()
        date = strftime('%d.%m.%y', now)
        time = strftime('%H.%M', now)
        sql = 'INSERT INTO t_log (text, datum, zeit) VALUES (%s, %s, %s)'
        cursor = self.db.cursor()
        cursor.execute(sql, (text, date, time))
        cursor.close()
        self.db.commit()
de_master
User
Beiträge: 72
Registriert: Samstag 15. Januar 2005, 15:19

@SigMA die Tabelle ist da. Die Berechtutung sollte auch vorhanden sein. Das werde ich am Montag jedoch nochmals prüfen.

@BlackJack ich habe es dem MySQLdb Doc so entnommen. Deine Schreibweise hab ich noch nirgends gesehn :(. ich kenne es eben von anderen Sprachen (PHP und Omnis Studio) in denen es auch so gemacht wird.
Würdest du mir bitte einen Link geben wo ich das nachlesen sodass ich auch verstehe was da genau getan wird.

Code: Alles auswählen

        sql = 'INSERT INTO t_log (text, datum, zeit) VALUES (%s, %s, %s)'
        cursor = self.db.cursor()
        cursor.execute(sql, (text, date, time))
        cursor.close()
        self.db.commit()
Gruss Michael
BlackJack

de_master hat geschrieben:@BlackJack ich habe es dem MySQLdb Doc so entnommen. Deine Schreibweise hab ich noch nirgends gesehn :(. ich kenne es eben von anderen Sprachen (PHP und Omnis Studio) in denen es auch so gemacht wird.
Würdest du mir bitte einen Link geben wo ich das nachlesen sodass ich auch verstehe was da genau getan wird.

Code: Alles auswählen

        sql = 'INSERT INTO t_log (text, datum, zeit) VALUES (%s, %s, %s)'
        cursor = self.db.cursor()
        cursor.execute(sql, (text, date, time))
        cursor.close()
        self.db.commit()
In der MySQLdb Doku die direkt bei `query()` dabei ist, steht schon ein Hinweis:

Code: Alles auswählen

In [3]:MySQLdb.connection.query?
Type:           method_descriptor
Base Class:     <type 'method_descriptor'>
String Form:    <method 'query' of '_mysql.connection' objects>
Namespace:      Interactive
Docstring:
    Execute a query. store_result() or use_result() will get the
    result set, if any. Non-standard. Use cursor() to create a cursor,
    then cursor.execute().
Es gibt für Python eine DB API, mittlerweile in der Version 2, an die sich die meisten Datenbankmodule halten, damit Datenbanken einfacher ausgetauscht werden können. Komplette Beschreibung gibt's als PEP 249 und eine kleine Einführung gibt's von A.M. Kuchling.
Antworten