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
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.