PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Генерирайте SQL изрази с python

Знам, че това е стар въпрос, но често съм искал това, което изглежда иска OP:МНОГО проста библиотека за генериране на основен SQL.

Функциите по-долу правят точно това. Вие им давате име на таблица и речник, съдържащ данните, които искате да използвате, и те връщат SQL заявката за операцията, от която се нуждаете.

Двойките ключ/стойност представляват имена на полета и стойности в редовете на базата данни.

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)

Използваш го така. Просто му дайте име на таблица и речник (или използвайте функцията **kwargs на 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';"

Но ВНИМАВАЙТЕ ОТ АТАКИ С ИНЖЕКТИРАНЕ НА SQL

Вижте какво се случва, когато злонамерен потребител на вашия код направи това:

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

Лесно е да направите свой собствен импровизиран ORM, но получавате само това, което виждате - трябва сами да избегнете въвеждането :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql:INSERT INTO ... (ИЗБЕРЕТЕ * ...)

  2. Има ли конвенция за именувани аргументи във функция в PostgreSQL

  3. Проблем с PSQLException и заключване при добавяне на тригер към таблицата

  4. Как да картографирате Postgres _INT8 към Java обект с помощта на Hibernate?

  5. Как да открия основната заявка на материализиран изглед, който създадох?