2012-04-05 10 views
1

Zum Beispiel, wenn ich cursor.execute()as documented:raw SQL gegen SQLite mit Django Ausführen führt in `Database: in der Nähe von "?": Syntax error`

>>> from django.db import connection 
>>> cur = connection.cursor() 
>>> cur.execute("DROP TABLE %s", ["my_table"]) 
django.db.utils.DatabaseError: near "?": syntax error 

Wenn Django Argument Substitution nicht verwendet wird, um die Abfrage funktioniert wie erwartet:

>>> cur.execute("DROP TABLE my_table") 
django.db.utils.DatabaseError: no such table: my_table 

Was mache ich falsch? Wie kann ich parametrisierte Abfragen arbeiten lassen?

Hinweise:

  • suffixing die Abfrage mit ; nicht
  • Gemäß der Dokumentation hilft, sollte %s verwendet werden, nicht SQLite ? ist (Django übersetzt %s zu ?)

Antwort

6

Sie können keine Parameter in SQL-Anweisungen anstelle von Kennungen (Spalte oder Tabellennamen) verwendet werden. Sie können sie nur anstelle von einzelnen Werten verwenden.

Stattdessen müssen Sie dynamisches SQL verwenden, um die gesamte SQL-Zeichenfolge zu erstellen und diese nichtparametrisiert an die Datenbank zu senden (besonders vorsichtig, um eine Injektion zu vermeiden, wenn der Tabellenname außerhalb Ihres Codes stammt).

3

Sie Metadaten können in parametrisierten Abfragen nicht ersetzt werden.