sql >> Database teknologi >  >> RDS >> PostgreSQL

Generer SQL-sætninger med python

Jeg ved, at dette er et gammelt spørgsmål, men jeg har ofte ønsket det, som det ser ud til, at OP ønsker:Et MEGET simpelt bibliotek til at generere grundlæggende SQL.

Nedenstående funktioner gør netop det. Du giver dem et tabelnavn og en ordbog, der indeholder de data, du vil bruge, og de returnerer SQL-forespørgslen til den handling, du har brug for.

Nøgle/værdi-parrene repræsenterer feltnavne og værdier i databaserækkerne.

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)

Du bruger det sådan. Bare giv den et tabelnavn og en ordbog (eller brug **kwargs-funktionen i 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';"

Men PAS PÅ SQL-INJEKTIONSANgreb

Se, hvad der sker, når en ondsindet bruger af din kode gør dette:

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

Det er nemt at lave din egen provisoriske ORM, men du får kun, hvad du ser - du skal selv undslippe input :)



  1. php-funktion til mysql enum valgt

  2. Får fejl under oprettelse af en visning i oracle DB

  3. Mysql-vælgforespørgsel for at få aktuelt brugerindlæg og fulgt venneindlæg

  4. Sådan ombrydes lange tekstlinjer i SQLite-resultater