使用python生成SQL语句

Jef*_*y04 10 python sql postgresql psycopg2

我需要从html文件生成一个insert语句列表(对于postgresql),是否有可用于python的库来帮助我正确转义并引用名称/值?在PHP中,我使用PDO进行转义和引用,是否有任何等效的python库?

编辑:我需要生成一个带有sql语句的文件,以便以后执行

Mor*_*sen 21

我知道这是一个老问题,但我经常想要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)
Run Code Online (Sandbox Code Playgroud)

你这样使用它.只需给它一个表名和一个字典(或使用python的**kwargs特性):

>>> 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';"
Run Code Online (Sandbox Code Playgroud)

但请注意SQL注入攻击

看看代码的恶意用户执行此操作时会发生什么:

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

制作你自己的临时ORM很容易,但你只得到你所看到的 - 你必须自己逃避输入:)


Cha*_*ffy 10

SQLAlchemy提供了一种强大的表达式语言,用于从Python生成SQL.

然而,与其他精心设计的抽象层一样,它生成的查询通过绑定变量插入数据,而不是通过尝试混合查询语言和插入到单个字符串中的数据.这种方法避免了大规模的安全漏洞,而且是正确的事情.

  • 链接已死。我认为这是相关文档:http://docs.sqlalchemy.org/en/latest/core/expression_api.html (2认同)

Chr*_*ung 2

为了稳健性,我建议使用准备好的语句来发送用户输入的值,无论您使用什么语言。:-)