Wie SQL Resultat "(158L,)" in Zahl "158"

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
SwissMäc
User
Beiträge: 20
Registriert: Freitag 26. Februar 2010, 21:36

Alle meine Versuche enden mit "TypeError: int() argument must be a string or a number, not 'tuple'"

Die Abfrage stimmt, aber wie kann ich das wandeln ?

Code: Alles auswählen

result=cursor.fetchall()
print result[1]
int(result[1])
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

SwissMäc hat geschrieben:Alle meine Versuche enden mit "TypeError: int() argument must be a string or a number, not 'tuple'"

Die Abfrage stimmt, aber wie kann ich das wandeln ?

Code: Alles auswählen

result=cursor.fetchall()
print result[1]
int(result[1])
Guck Dir doch mal die Ausgabe von result[1] genau an! fetchhall() liefert ein iterable von tupeln zurück. Du hast also kein Integer oder String, sondern ein Tupel! (das sagt Dir ja sogar die Fehlermeldung)
Benutzeravatar
SwissMäc
User
Beiträge: 20
Registriert: Freitag 26. Februar 2010, 21:36

Ich steh immer noch am Berg, ich will ja gar keine Tupel sondern ein Integer, aber ich weiss nicht wie man das macht ?
(Anfänger :oops: )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

SwissMäc hat geschrieben:Ich steh immer noch am Berg, ich will ja gar keine Tupel sondern ein Integer, aber ich weiss nicht wie man das macht ?
(Anfänger :oops: )
Das kann man doch ein einer Shell leicht nachvollziehen:

Code: Alles auswählen

In [1]: (128L,)
Out[1]: (128L,)

In [2]: row = (128L,)

In [3]: int(row)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

C:\Dokumente und Einstellungen\nelson\Eigene Dateien\<ipython console> in <modul
e>()

TypeError: int() argument must be a string or a number, not 'tuple'

In [4]: row[0]
Out[4]: 128L

In [5]: int(row[0])
Out[5]: 128
Eine Datenbankabfrage liefert Dir immer eine bestimmte Anzahl an Tupeln zurück. Jedes Tupel kann nun einmal beliebig viele Einträge haben. In Deinem Falle ist es nur eins, da in Deiner Tabelle wohl nur eine Spalte vorhanden ist. Das Ergebnis ist dennoch eine beliebig große Anzahl an Tupeln.

Ein Tupel wiederum kann eben nur auch beliebig viele Einträge haben. Auch wenn es in Deinem Falle nur ein Wert ist, so liefert Dir Python hier eben dennoch den Wert als Eintrag eines Tupels. Du musst also per Index auf den Eintrag des Tupels zugreifen, den Du haben möchtest. In diesem Falle eben [0]...

Du solltest mal das Tutorial durcharbeiten. Dort werden die grundlegenden Datenobjekte von Python erklärt.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

noch ein Tipp: Wenn du mehr als ein Ergebnis aus der DB-Abfrage hast, bekommst du immer ein Tuple von Tuplen. Da muss dran denken, wenn du die Daten aus dem Tuple holen willst.

Gruß, noisefloor
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

noisefloor hat geschrieben:Hallo,

noch ein Tipp: Wenn du mehr als ein Ergebnis aus der DB-Abfrage hast, bekommst du immer ein Tuple von Tuplen. Da muss dran denken, wenn du die Daten aus dem Tuple holen willst.

Gruß, noisefloor
Äh... das hatte ich bereits erwähnt ;-)

naja, doppelt hält besser :-D
Antworten