Variable Datenausgabe

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
pylis
User
Beiträge: 6
Registriert: Samstag 15. März 2014, 18:08

Code: Alles auswählen

 a=self.lineEdita.text()
        b=str (self.comboBoxTabelle.currentText())
        print a
        print b
        if b=="Subjects":
            cursor.execute("SELECT ? FROM Subjects", (a,))
            AusgabeDatensatz = cursor.fetchall()
            print AusgabeDatensatz
            connection.commit()
hierbei bekomme ich den Fehler:
cursor.execute("SELECT ? FROM Subjects", (a,))
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.

In der LineEdita soll man die Spalte eingeben können, um dann die Daten ausgespuckt zu bekommen.
Kann mir jemand weiterhelfen?
Liebe Grüße,
pylis (<Python Neuling>)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@pylis: Platzhalter (?) in SQL-Statements sind nur für Werte da und nicht für Spalten- bzw. Tabellennamen. Da diese für Abfragen normalerweise fix sind, ist das aber keine Einschränkung. Variable Spaltennamen können nur über Stringformatierung realisiert werden.
BlackJack

@pylis: Die Platzhalter sind nur für Werte gedacht, nicht für Spaltennamen. Dafür muss man auf Zeichenkettenformatierung zurückgreifen. Und aufpassen das da vom Anwender nichts gewfährliches eingeschleust werden kann. Also im Grunde öffnest Du da die Tür für jedweden Zugriff, inklusive Daten löschen, mit den Rechten die das Programm hat.

Der Name `AusgabeDatensatz` ist unpassend weil da eine Liste mit Datensätzen dran gebunden wird.
pylis
User
Beiträge: 6
Registriert: Samstag 15. März 2014, 18:08

Vielen Dank euch beiden,
dann werd ich versuchen, das irgendwie anders zu lösen!
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Hallo,

wie wäre es mit diesem Workaround (zumindest für sqlite3):
siehe auch Doku
http://docs.python.org/3.2/library/sqlite3.html

"Cursor Objects
description

This read-only attribute provides the column names of the last query. To remain compatible with the Python DB API, it returns a 7-tuple for each column where the last six items of each tuple are None.
It is set for SELECT statements without any matching rows as well."

==> Mit einem "sinnlosen" select die Tabelle abfragen. Anschließend mit der Methode "description" des Cursor-Objekt die Spaltennamen der Tabelle ermitteln und diese dann dem Anwender zur Auswahl zur Verfügung stellen.
Vielleicht aber auch mal in der Doku der verwendeten Datenbank schauen, ob es da nicht einen direkteren Weg gibt, die Definition einer Tabelle zu ermitteln.

gesucht und auch gleich gefunden:
mit SQL "pragma table_info (Tabellenname)" kann man unter sqlite3 die Beschreibung einer Tabelle direkt ermitteln
BlackJack

Wenn man nicht selber ein datenbankspezifisches Rad erfinden möchte, könnte man auch einen Blick auf SQLAlchemy werfen.
Antworten