Seite 1 von 1
Variable Datenausgabe
Verfasst: Dienstag 18. März 2014, 15:20
von pylis
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>)
Re: Variable Datenausgabe
Verfasst: Dienstag 18. März 2014, 15:39
von Sirius3
@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.
Re: Variable Datenausgabe
Verfasst: Dienstag 18. März 2014, 15:40
von 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.
Re: Variable Datenausgabe
Verfasst: Dienstag 18. März 2014, 15:44
von pylis
Vielen Dank euch beiden,
dann werd ich versuchen, das irgendwie anders zu lösen!
Re: Variable Datenausgabe
Verfasst: Mittwoch 19. März 2014, 14:51
von bfm
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
Re: Variable Datenausgabe
Verfasst: Mittwoch 19. März 2014, 15:12
von BlackJack
Wenn man nicht selber ein datenbankspezifisches Rad erfinden möchte, könnte man auch einen Blick auf SQLAlchemy werfen.