SQLite3 Select

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
vankuche
User
Beiträge: 3
Registriert: Donnerstag 10. März 2011, 11:45

Hallo,

ich möchte in einem Select Statement variabel den Spaltennamen tauschen um zwei Datenbanken abzugleichen.
Dabei habe ich festgestellt, dass Hochkommas oder Anführungszeichen um den Spaltennamen ein Problem sind.

1. Funktioniert nicht:

Code: Alles auswählen

column = 'a'
sql = "SELECT ? FROM settings"
db2cursor.execute(sql, (column,))
2. Funktioniert:

Code: Alles auswählen

column = 'a'
sql = "SELECT %s FROM presettings" % column
db2cursor.execute(sql)
3. Funktioniert nicht:

Code: Alles auswählen

sql = "SELECT 'a' FROM settings"
db2cursor.execute(sql)
4. Funktioniert:

Code: Alles auswählen

sql = "SELECT a FROM settings"
db2cursor.execute(sql)
Warum funktioniert die erste und dritte Variante nicht? Was muss ich ändern, damit ich wie in der ersten Variante die gewählten Spalten leicht Tauschen kann?

Danke.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Das funktioniert nicht, weil

Code: Alles auswählen

"SELECT 'a' FROM settings"
etwas anderes ist als

Code: Alles auswählen

"SELECT a FROM settings"
Die nicht funktionierenden Varianten liefern beide die erste Variante.

Sebastian
Das Leben ist wie ein Tennisball.
vankuche
User
Beiträge: 3
Registriert: Donnerstag 10. März 2011, 11:45

Die Frage ist nur, was muss ich an Variante 1 ändern, damit sie funktioniert.
deets

vankuche hat geschrieben:Die Frage ist nur, was muss ich an Variante 1 ändern, damit sie funktioniert.
Die 2te Variante nehmen?

Natuerlich oeffnest du dich je nach Herkunft der Eingaben damit fuer SQL-Injecktion. Aber es gibt keinen sicheren Weg, SQL-Statements selbst zu bauen. Nur zu parametrisieren. Denn das ist auch kein normaler Use-Case - schliesslich weiss man normalerweise, wie die Datenbank aussieht, und baut halt entsprechende Statements.

Die einzige (aber recht aufwaendige) Alternative waere, SQLAlchemy zu verwenden und Tabellen und Spalten-Mappings zu bauen, und dann damit zu arbeiten. Es kann sein, das SA ein paar Sanity-Checks hat.
vankuche
User
Beiträge: 3
Registriert: Donnerstag 10. März 2011, 11:45

Ich kenne den Inhalt meiner Datenbank leider nicht sicher, da ich nicht weiß von welcher alten Version ich aus starte.

Aber danke für die Erklärung. Ich werde dann Variante 2 verwenden.
Antworten