Ergebnis Formatieren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
bb1898
User
Beiträge: 199
Registriert: Mittwoch 12. Juli 2006, 14:28

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