Seite 1 von 1
Warning: Truncated incorrect INTEGER value
Verfasst: Montag 17. Dezember 2007, 13:57
von fanus
hallo liebe leute,
die anfängerin braucht wieder Eure hilfe

also schnell zusammengefasst:
Code: Alles auswählen
self.fieldlist = []
if get_id:
self.fieldlist.append("id = '%s'" % self.get_id().GetValue())
if get_name:
self.fieldlist.append("name = '%s'" %self.get_name().GetValue())
if get_vorname:
self.fieldlist.append("vorname = '%s'" % self.get_vorname().GetValue())
cur.execute( '''
SELECT
id,
name,
vorname
FROM
person
WHERE
(
%(fields)s
)
'''
,
{
'fields':", ".join(self.fieldlist)
}
)
das gibt:
Code: Alles auswählen
Warning: Truncated incorrect INTEGER value: ''
'fields':", ".join(self.fieldlist)
zurück
wenn ich aber die liste teste
dann steht drin was ich in mysql-befehl geben soll....any idea??
danke für Eure Hilfe.
LG,
fanus

Verfasst: Montag 17. Dezember 2007, 14:14
von meneliel
Kann es sein, dass "id" eigentlich als INTEGER festgelegt ist in der Datenbank?
Du übergibst ID aber dann als string.
Verfasst: Montag 17. Dezember 2007, 14:43
von fanus
das stimmt und weil ich keine ahnung hab, hab ich die ID weg gelassen und nochmal getestet aber leider immernoch dasselbe problem
Code: Alles auswählen
self.fieldlist = []
if get_name:
self.fieldlist.append("name = '%s'" %self.get_name().GetValue())
if get_vorname:
self.fieldlist.append("vorname = '%s'" % self.get_vorname().GetValue())
cur.execute( '''
SELECT
name,
vorname
FROM
person
WHERE
(
%(fields)s
)
'''
,
{
'fields':", ".join(self.fieldlist)
}
)
Verfasst: Montag 17. Dezember 2007, 14:52
von fanus
so funktioniert das:
Code: Alles auswählen
self.valueslist = ['Max']
.
.
.
WHERE
(
name = %(values)s
)
'''
,
{
'values':", ".join(self.valueslist)
}
)
so aber nicht:
Code: Alles auswählen
self.fieldfist = ['name']
self.valueslist = ['Max']
.
.
.
WHERE
(
%(fields)s = %(values)s
)
'''
,
{
'fields':", ".join(self.fieldlist)
'values':", ".join(self.fieldlist)
}
)
verstehs aber nicht wieso... es sind doch beide strings
PS: vllt ein Beispiel zu dem Thema?!
Verfasst: Montag 17. Dezember 2007, 15:08
von BlackJack
Lass Dir die SQL-Anfragen doch einfach mal ausgeben.
Dass das erste funktioniert ist Zufall, bzw. wundert es mich das es überhaupt funktioniert weil 'Max' "ungequotet" eigentlich der Name einer SQL-Funktion ist. Da steht so etwas wie ``name = Max``, was im Grunde kein gültiges SQL sein dürfte.
Und beim zweiten Beispiel, wenn in den beiden Listen mehrere Elemente stehen wird etwas der Art ``a, b, c = d, e, f`` erzeugt, was ganz bestimmt kein gültiges SQL ist.
Last but not least sollte man keine Werte selber in SQL-Anfragen hineinformatieren, schon gar nicht wenn die vom Programmbenutzer eingegeben werden, sondern das dem SQL-Modul überlassen: [wiki]Parametrisierte SQL-Queries[/wiki]
Verfasst: Montag 17. Dezember 2007, 15:35
von fanus
BlackJack hat geschrieben:
Und beim zweiten Beispiel, wenn in den beiden Listen mehrere Elemente stehen wird etwas der Art ``a, b, c = d, e, f`` erzeugt, was ganz bestimmt kein gültiges SQL ist.
das war nur zum testen... eigentlich war das so gedacht:
Code: Alles auswählen
if get_name:
self.fieldlist.append("name = '%s'" %self.get_name().GetValue())
if get_vorname:
self.fieldlist.append("vorname = '%s'" % self.get_vorname().GetValue())
kannst Du mir bitte sagen wie ich das für MySQL-DB mit "Parametrisierte SQL-Queries" basteln kann??
ich kriege nur fehlermeldung
Code: Alles auswählen
.
.
.
WHERE name = ?
AND vorname = ?
''', ('a', 'b'))
.
.
.
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
Verfasst: Montag 17. Dezember 2007, 15:44
von BlackJack
Soweit ich weiss benutzt MySQLdb keine '?' als Formatzeichen. Wie man das herausfindet steht aber im Wiki.
Verfasst: Montag 17. Dezember 2007, 15:47
von fanus
BlackJack hat geschrieben:Soweit ich weiss benutzt MySQLdb keine '?' als Formatzeichen. Wie man das herausfindet steht aber im Wiki.
danke
Verfasst: Dienstag 18. Dezember 2007, 10:39
von fanus
Code: Alles auswählen
cur.execute("""SELECT a, b FROM meine_Tabelle WEHRE x = '2' AND y = 'bla' AND z = '5.2'""")
dabei sind a und b fest aber möchte dass x, y, und z dynamisch sind, ich meine damit, dass die WHERE so aussehen könnte:
oder
oder
usw.
ich hab in die spalten und die werte in
Code: Alles auswählen
columns = ['x', 'y', 'z']
clos = ", ".join(columns)
values = ['2','bla','5.3']
wie kann ich das zusammen basteln und nach der WHERE abfragen...
vielen Dank für Eure Hilfe.
LG,
fanus
Verfasst: Dienstag 18. Dezember 2007, 10:59
von meneliel
fanus hat geschrieben:Code: Alles auswählen
[code=py]cur.execute("""SELECT a, b FROM meine_Tabelle WEHRE x = '2' AND y = 'bla' AND z = '5.2'""")
[/code]
wie kann ich das zusammen basteln und nach der WHERE abfragen...
vielen Dank für Eure Hilfe.
LG,
fanus
Ich würde es so machen:
Code: Alles auswählen
cur.execute('SELECT a, b FROM meine_Tabelle WHERE x = %s AND y = %s AND z = %s', values)
(ungetestet)
Verfasst: Dienstag 18. Dezember 2007, 11:13
von fanus
meneliel hat geschrieben:
Ich würde es so machen:
Code: Alles auswählen
cur.execute('SELECT a, b FROM meine_Tabelle WHERE x = %s AND y = %s AND z = %s', values)
(ungetestet)
danke für die Antwort aber so sind x, y und z fest und nicht dynamisch. es muss aber auch möglich sein nur nach x zu fragen oder nach y oder nach x und z usw.
Verfasst: Dienstag 18. Dezember 2007, 11:24
von meneliel
x,y,z sind nicht "fest". Eingesetzt werden die Werte, die aktuell in "values" stehen. Das kannst du ja jeder Zeit ändern, z.B mit jedem Schleifendurchlauf.
Wie willst du denn festlegen, ob du nur nach x, oder nach x und y und z etc fragst?
Klingt irgendwie genau wie das Problem, was ich letzte Woche auch hatte
EDIT:
http://www.python-forum.de/topic-12824.html vielleicht hilft dir irgendwas davon weiter.
Verfasst: Dienstag 18. Dezember 2007, 11:51
von fanus
meneliel hat geschrieben:
Wie willst du denn festlegen, ob du nur nach x, oder nach x und y und z etc fragst?
wenn man erst die benötigen cols in einer liste bestimmt zB. cols = ['v','w','x','y','z'] und die variablen in einer anderen liste zB. values = ['1','2','3','4','5'] kann man nicht -je nach was in cols und values steht- das in einem string zusammenstzt und dann nach der WHERE angeben?
möchte nur wissen ob das überhaupt funktionieren könnte!
LG,
fanus
Verfasst: Dienstag 18. Dezember 2007, 12:35
von meneliel
ja

tut es.
wenn ich dich richtig verstanden hab, legst du vorher die cols und values fest und es gibt immer genuso viel values wie cols?
Wenn ja müsste das so funktionieren:
Code: Alles auswählen
query = "select a,b from meine Tabelle where 1=1 "
cols = ["x","y","z"]
for element in cols:
query += " and " + element +" = %s "
cur.execute(query, values)
Ich gehe davon aus, das z.B BlackJack jetzt wieder eine wunderschöne Alternative hat das mühsam zusammengestückelte query, aber auf die schnelle müsste es so funktionieren

Verfasst: Dienstag 18. Dezember 2007, 12:57
von fanus
vielen dank
meneliel!
genau das wollte ich
LG,
fanus

Verfasst: Dienstag 18. Dezember 2007, 13:41
von meneliel
Danke muss gehen an Keppla

von dem kommt diese rettende Idee
