Dynamische SQL-WHERE-Klausel generation
Für die Aufnahme, ich bin mit Python und SQLlite. Ich habe eine funktionierende Funktion, generiert die SQL, die ich brauche, aber es scheint nicht richtig zu sein.
def daily(self, host=None, day=None):
sql = "SELECT * FROM daily WHERE 1"
if host:
sql += " AND host = '%s'" % (host,)
if day:
sql += " AND day = '%s'" % (day,)
return sql
Werde ich wohl müssen, fügen Sie mehrere Spalten und Kriterien später auf.
Irgendwelche besseren Ideen?
Edit:
Was nicht gut aussieht ist, dass ich den Bau der SQL dynamisch aus Strings. Dies ist in der Regel nicht der beste Ansatz. SQL-Injektionen Angriffe, brauchen, um richtig zu escape-Zeichenfolgen. Ich kann nicht verwenden Sie Platzhalter, weil einige der Werte sind None und müssen nicht in der WHERE-Klausel-Bedingung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du wirklich nicht möchten, dass die Verwendung von string-Formatierung, um Werte zählen. Verlassen, dass die Datenbank-API via SQL-Parameter.
Verwendung von Parametern Sie:
Da SQLLite unterstützt benannte SQL-Parameter, ich würde wieder sowohl eine Erklärung und ein dictionary mit Parametern:
dann pass beide zu
cursor.execute()
:SQL-Generierung wird komplexer schnell, möchten Sie vielleicht zu schauen, SQLAlchemy core zu tun, die generation statt.
Für Ihr Beispiel, Sie generieren können:
Den
query
- Objekt kann zusätzliche Filter angewendet wurden, werden geordnet, gruppiert, als eine Teilauswahl treffen", um andere Abfragen, und trat schließlich geschickt ausgeführt werden, an welcher Stelle SQLAlchemy wird, deaktivieren Sie diese in SQL fit für die jeweilige Datenbank, zu der Sie eine Verbindung herstellen.