Seite 1 von 1
OOP Problem
Verfasst: Freitag 9. Juni 2006, 13:47
von de_master
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
Verfasst: Freitag 9. Juni 2006, 17:42
von SigMA
*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
Re: OOP Problem
Verfasst: Freitag 9. Juni 2006, 23:19
von 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()
Verfasst: Sonntag 11. Juni 2006, 08:58
von de_master
@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
Verfasst: Montag 12. Juni 2006, 07:36
von 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.