Warning: Truncated incorrect INTEGER value

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

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

Code: Alles auswählen

print ", ".join(self.fieldlist) 
dann steht drin was ich in mysql-befehl geben soll....any idea??

Code: Alles auswählen

   
    id = '1' , name = 'Max', vorname = 'Mustermann' 
danke für Eure Hilfe.
LG,
fanus
:)
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Kann es sein, dass "id" eigentlich als INTEGER festgelegt ist in der Datenbank?

Du übergibst ID aber dann als string.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

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)                     
                        }
                        )
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

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?!
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]
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

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
BlackJack

Soweit ich weiss benutzt MySQLdb keine '?' als Formatzeichen. Wie man das herausfindet steht aber im Wiki.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

BlackJack hat geschrieben:Soweit ich weiss benutzt MySQLdb keine '?' als Formatzeichen. Wie man das herausfindet steht aber im Wiki.
danke
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

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:

Code: Alles auswählen

WEHRE y = 'bla' 
oder

Code: Alles auswählen

... WEHRE x = '5' 
oder

Code: Alles auswählen

WEHRE x = '3' AND y = 'bla bla'
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
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

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)
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

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.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

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.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

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
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

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 ;-)
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

vielen dank meneliel!
genau das wollte ich :)

LG,
fanus
:)
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Danke muss gehen an Keppla :) von dem kommt diese rettende Idee ;-)
Antworten