使用python生成SQL语句

使用python生成SQL语句,python,sql,postgresql,psycopg2,Python,Sql,Postgresql,Psycopg2,我需要从html文件生成一个insert语句列表(对于postgresql),是否有python可用的库来帮助我正确地转义和引用名称/值?在PHP中,我使用PDO进行转义和引用,是否有python的等效库 编辑:我需要生成一个包含sql语句的文件以供以后执行为保证健壮性,我建议使用准备好的语句发送用户输入的值,无论您使用何种语言。:-) 对连接对象有一个“.execute”方法。您可以使用此函数指定参数(使用逗号而不是%符号将参数与查询字符串分开)。SQLAlchemy提供了从Python生成S

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


编辑:我需要生成一个包含sql语句的文件以供以后执行

为保证健壮性,我建议使用准备好的语句发送用户输入的值,无论您使用何种语言。:-)

对连接对象有一个“.execute”方法。您可以使用此函数指定参数(使用逗号而不是%符号将参数与查询字符串分开)。

SQLAlchemy提供了从Python生成SQL的功能


然而,与其他设计良好的抽象层一样,它通过绑定变量生成插入数据的查询,而不是尝试将查询语言和插入到单个字符串中的数据混合在一起。这种方法避免了大量的安全漏洞,在其他方面是正确的。

通常手动引用参数是个坏主意。如果逃逸规则有错误怎么办?如果escape与数据库的旧版本不匹配怎么办?如果您只是忘记转义某个参数,或者错误地假设它不能包含需要转义的数据,该怎么办?这一切都可能导致SQL注入漏洞。此外,当您需要为LOB列传递大数据块时,DB可以对SQL语句长度有一些限制。这就是为什么Python DB API和大多数数据库(若数据库不支持,Python DB API模块将透明地转义参数,就像早期的MySQLdb一样)允许传递与语句分离的参数:

.execute(操作[,参数])


我知道这是一个老问题,但我经常想要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)
你这样使用它。只需给它一个表名和一个字典(或者使用python的**kwargs特性):

但要小心SQL注入攻击

看看当恶意代码用户执行以下操作时会发生什么:

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

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

已经有这样做的库了吗?虽然我想要普通的sql语句作为输出:)我理解,但我只想要一个sql语句列表(不执行它们)链接已失效。我认为这是相关的文档:@phaseetwenty,谢谢,更新了(五年后,呵呵)。我认为直接链接到SQLAlchemy核心文档的根目录已经过时了。链接仍然有效!由于数据库引擎和执行生成的库之间对Unicode字符的不同解释等抽象原因,生成带有数据串联的“纯SQL语句”本质上容易出现安全故障。这不是你应该尝试去做的事情。因此,输出应该以查询字符串/数据列表组合的形式表述,并传递给数据库API。SQLAlchemy将自动执行此操作。我理解,但是用例生成了一个SQL文件,稍后将在这里为insert语句执行,它总是在单引号内生成值。因此,必须按如下方式修改此代码,```keys=[%s”%k代表kwargs中的k]#values=[“'%s'%v代表kwargs中的v.values()]values=[]代表kwargs.values()中的值:如果类型(值)是str:values.append('%s'(值)),elif值是None:values.append(“%s”(“”))else:值。追加(“%s”%value)```
>>> read("tbl", **{"user_group": "admin'; DROP TABLE tbl; --"})
"SELECT * FROM tbl WHERE user_group = 'admin'; DROP TABLE tbl; --';"