Seite 1 von 1

Ergebnis Formatieren

Verfasst: Samstag 3. Oktober 2015, 21:25
von köttbullar
Hallo Python forum,

ich mache gerade eine Datenbankabfrage mit folgendem Code:

Code: Alles auswählen

        cur.execute("Select State FROM Test where ID = 1")         
        conn.commit() 
        rows = cur.fetchall()
        print rows[0]
als Ergebnis erhalte ich:
(True,)

eigentlich hätte ich nur "True" erwartet
was mach ich falsch?
oder ist das richtig?

ich würde gerne nur "True" erwarten

Re: Ergebnis Formatieren

Verfasst: Samstag 3. Oktober 2015, 21:30
von mutetella
@köttbullar
Als Ergebnis erhältst Du ein tuple, auf dessen Elemente Du via index zugreifst. In Deinem Fall also

Code: Alles auswählen

>>> result = (True,)
>>> result[0]
True
mutetella

Re: Ergebnis Formatieren

Verfasst: Samstag 3. Oktober 2015, 22:08
von Sirius3
@köttbullar: ich weiß nicht, warum Du das erwartest. fetchall liefert eine Liste mit Tuplen der Tabellenspalten. Aber, wenn Du nur einen Datensatz erwartest, warum nimmst Du dann fetchall und was soll das commit bewirken?

Re: Ergebnis Formatieren

Verfasst: Samstag 3. Oktober 2015, 22:13
von sparrow
Warum machst du nach einem SELECT ein Commit? Das macht keinen Sinn. Ein Commit beendet eine Transaktion positiv, schreibt also Änderungen in DBMS fest. Da du nur ein SELECT ausführst, muss da also nichts festgeschrieben werden.
Du möchtest dich über Datenbanktransaktionen informieren.

Wenn es "fetchall" gibt, dann gibt es möglicherweise auch "fetchone". Das macht aber nur Sinn, wenn wirklich nur eine Zeile als Ergebnis zu erwarten ist.

Re: Ergebnis Formatieren

Verfasst: Samstag 3. Oktober 2015, 22:53
von Hyperion
@sparrow: Da auf *eine* ``ID`` eingeschränkt wird, klingt das verdächtig nach einem PK und damit nur einem Tupel. Aber klar, nur der OP kann das definitiv wissen.

Re: Ergebnis Formatieren

Verfasst: Dienstag 6. Oktober 2015, 19:01
von bb1898
sparrow hat geschrieben:Warum machst du nach einem SELECT ein Commit? Das macht keinen Sinn. Ein Commit beendet eine Transaktion positiv, schreibt also Änderungen in DBMS fest. Da du nur ein SELECT ausführst, muss da also nichts festgeschrieben werden.
Du möchtest dich über Datenbanktransaktionen informieren.
Der OP hat sich nicht zum verwendeten Datenbanksystem geäußert. Und bei Firebird steckt auch ein SELECT in einer Transaktion, die abgeschlossen werden soll / muss. Ich habe es zu lange nicht verwendet, um noch genau zu wissen, was andernfalls passiert. Klar ist, dass natürlich auch für mehrere SELECT-Befehle hintereinander ein COMMIT am Ende genügt und dass es hier keinen (oder keinen offensichtlichen) Unterschied zwischen COMMIT und ROLLBACK gibt. Allerdings ist das wohl wirklich eine Ausnahme.
Wenn es "fetchall" gibt, dann gibt es möglicherweise auch "fetchone". Das macht aber nur Sinn, wenn wirklich nur eine Zeile als Ergebnis zu erwarten ist.
Wenn das benutzte Datenbankmodul die DB API 2.0 befolgt, was die meisten ja tun, dann muss es fetchone geben. Das gibt dann einfach den einzigen / ersten / nächsten Satz des Ergebnisses zurück, ersatzweise None.