sql >> Database >  >> RDS >> PostgreSQL

Genereer SQL-instructies met python

Ik weet dat dit een oude vraag is, maar ik heb vaak gewild wat het OP wil:een ZEER eenvoudige bibliotheek voor het genereren van basis-SQL.

De onderstaande functies doen precies dat. Je geeft ze een tabelnaam en een woordenboek met de gegevens die je wilt gebruiken en ze retourneren de SQL-query voor de bewerking die je nodig hebt.

De sleutel/waarde-paren vertegenwoordigen veldnamen en waarden in de databaserijen.

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)

Je gebruikt het zo. Geef het gewoon een tabelnaam en een woordenboek (of gebruik de **kwargs-functie van 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';"

Maar PAS OP VOOR SQL-INJECTIE-AANVALLEN

Kijk wat er gebeurt als een kwaadwillende gebruiker van je code dit doet:

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

Het is gemakkelijk om je eigen geïmproviseerde ORM te maken, maar je krijgt alleen wat je ziet -- je moet zelf aan de invoer ontsnappen :)



  1. Wat is de maximale vergoeding voor group_concat_max_len in MySQL?

  2. PHP:Cyrillische (Russische) tekens echoën als vraagtekens. Waarom?

  3. Verbindingsfout tijdens het verbinden met PostgreSQL als postgres-gebruiker?

  4. Grondbeginselen van tabeluitdrukkingen, deel 12 - Inline tabelwaardige functies