SQLite syntax error bei ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Hallo,

ich bin ratlos, schon gestern habe ich versucht eine SQLite Tabelle zu ändern und habe es auf heute verschoben, aber ich komme nicht weiter, wenn ich die Werte mittel ? ersetzen lassen will.
Wenn ich den gewünschten Wert direkt in den SQL Befehl eingebe läuft es problemlos durch. Hier jedoch ...

Code: Alles auswählen

from sqlite3 import dbapi2 as sqlite
con = sqlite.connect(DATABASE)
con.row_factory = Row
cur = con.cursor

column_name = "neue_spalte"
query = '''ALTER TABLE meine_tabelle ADD COLUMN ? text'''
cur.execute(query, [column_name]
... erhalte ich diesen Fehler:
sqlite3.OperationalError: near "?": syntax error
Was mache ich Falsch?

Hier ( https://docs.python.org/2/library/sqlite3.html ) steht ja:
# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()
Bei mir funktioniert jedoch nut die 1. Methode... :K
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@martinjo: die Variablenersetzung per Platzhalter funktioniert nur bei Variablen. Spaltennamen sind, wie Tabellennamen, Namen. Da macht ein Platzhalter keinen Sinn.
BlackJack

Und nur so prophylaktisch: Das macht man in der Regel ja nicht per Programm, denn normale Programme verändern die Datenbankstruktur nicht. Das sollte also nichts sein was Dein Programm regelmässig macht, sonst stimmt was mit dem Datenbankentwurf nicht.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Vielen Dank.

Es ging nur um zwei Spalten die ich hinzufügen wollte. Jedoch baue ich mir auch für so Kleinigkeiten gerne Skripte damit ich es später wiederholen kann um Zeit zu sparen. Dass ging wohl nach hinten los :-)
Antworten