PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Generieren Sie SQL-Anweisungen mit Python

Ich weiß, dass dies eine alte Frage ist, aber ich wollte oft, was das OP anscheinend will:Eine SEHR einfache Bibliothek zum Generieren von grundlegendem SQL.

Die folgenden Funktionen tun genau das. Sie geben ihnen einen Tabellennamen und ein Wörterbuch mit den Daten, die Sie verwenden möchten, und sie geben die SQL-Abfrage für die gewünschte Operation zurück.

Die Schlüssel/Wert-Paare repräsentieren Feldnamen und Werte in den Datenbankzeilen.

def read(table, **kwargs):
    """ Generates SQL for a SELECT statement matching the kwargs passed. """
    sql = list()
    sql.append("SELECT * FROM %s " % table)
    if kwargs:
        sql.append("WHERE " + " AND ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
    sql.append(";")
    return "".join(sql)


def upsert(table, **kwargs):
    """ update/insert rows into objects table (update if the row already exists)
        given the key-value pairs in kwargs """
    keys = ["%s" % k for k in kwargs]
    values = ["'%s'" % v for v in kwargs.values()]
    sql = list()
    sql.append("INSERT INTO %s (" % table)
    sql.append(", ".join(keys))
    sql.append(") VALUES (")
    sql.append(", ".join(values))
    sql.append(") ON DUPLICATE KEY UPDATE ")
    sql.append(", ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
    sql.append(";")
    return "".join(sql)


def delete(table, **kwargs):
    """ deletes rows from table where **kwargs match """
    sql = list()
    sql.append("DELETE FROM %s " % table)
    sql.append("WHERE " + " AND ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
    sql.append(";")
    return "".join(sql)

Sie verwenden es so. Geben Sie ihm einfach einen Tabellennamen und ein Wörterbuch (oder verwenden Sie die **kwargs-Funktion von Python):

>>> upsert("tbl", LogID=500, LoggedValue=5)
"INSERT INTO tbl (LogID, LoggedValue) VALUES ('500', '5') ON DUPLICATE KEY UPDATE LogID = '500', LoggedValue = '5';"

>>> read("tbl", **{"username": "morten"})
"SELECT * FROM tbl WHERE username = 'morten';"

>>> read("tbl", **{"user_type": 1, "user_group": "admin"})
"SELECT * FROM tbl WHERE user_type = '1' AND user_group = 'admin';"

Aber VORSICHT VOR SQL-INJEKTIONSANGRIFFEN

Sehen Sie sich an, was passiert, wenn ein böswilliger Benutzer Ihres Codes Folgendes tut:

>>> read("tbl", **{"user_group": "admin'; DROP TABLE tbl; --"})
"SELECT * FROM tbl WHERE user_group = 'admin'; DROP TABLE tbl; --';"

Es ist einfach, Ihr eigenes behelfsmäßiges ORM zu erstellen, aber Sie erhalten nur das, was Sie sehen – Sie müssen der Eingabe selbst entgehen :)