PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Generuj instrukcje SQL za pomocą Pythona

Wiem, że to stare pytanie, ale często chciałem tego, czego chce OP:BARDZO prostej biblioteki do generowania podstawowego SQL.

Poniższe funkcje właśnie to robią. Dajesz im nazwę tabeli i słownik zawierający dane, których chcesz użyć, a oni zwracają zapytanie SQL dla żądanej operacji.

Pary klucz/wartość reprezentują nazwy pól i wartości w wierszach bazy danych.

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)

Używasz go w ten sposób. Po prostu nadaj mu nazwę tabeli i słownik (lub użyj funkcji **kwargs w Pythonie):

>>> 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';"

Ale UWAŻAJ NA ATAKI WSTRZYKIWANIA SQL

Zobacz, co się stanie, gdy złośliwy użytkownik Twojego kodu zrobi to:

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

Łatwo jest stworzyć własny prowizoryczny ORM, ale dostajesz tylko to, co widzisz - musisz sam uciec od wejścia :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mam problemy z połączeniem HAVING z WHERE na bardzo prostym QUERY

  2. Uciekanie nazw kolumn podobnych do słów kluczowych w Postgres

  3. Jak zaktualizować wiersze dwóch tabel, które mają ograniczenia dotyczące kluczy obcych

  4. JavaScript (Postgres DB) - Jak używać przygotowanej instrukcji z tablicą jako parametrem w klauzuli WHERE IN ( )

  5. nie można przetłumaczyć nazwy hosta postgres na adres:Nieznana nazwa lub usługa