Python 和 Prepared SQL 使用变量的语句

Python and Prepared SQL Statements using Variables

我是 Python 的新手,但我正在处理一个项目,所以请原谅我的诞生。 我在 Python 2.7 中写了一些 SQL 语句(库还没有升级到 3),但我被困在了它们的最佳实践过程中。我们正在使用 Sybase。最初我使用

query = "UPDATE DB..TABLE SET version = '{}' WHERE name = '{}'".format(app.version, app.name)
cursor.execute(query)

但在进一步阅读后意识到它可以注入。所以我然后看着做以下事情:

query = "UPDATE DB..TABLE SET version = '%s' WHERE name = '%s'" % (app.version, app.name)
cursor.execute(query)

但是让我想到这不是一回事吗?

参数也是argparse设置的变量,这意味着我必须在%s周围使用''否则它会抛出无效的列名错误。这让我很沮丧,因为如果其他查询中没有设置任何附加标志,我也希望能够默认传递 NULL(None in Python),否则它显然会插入“NULL”作为字符串.

对于这个特定示例,2 个变量是从 ConfigParser 读取的文件中设置的,但我认为 argparse 变量仍然相同。例如

[SECTION]
application=name
version=1.0

我不太确定如何最好地解决这个问题,是的,我知道“PYTHON 3 是更好的升级”,正如我在开始时所说的那样,图书馆正在正在移植中。

如果您需要任何其他信息,请告知,我会尽我所能。

更新*** 使用我在一些 sybase 文档中发现的以下 Param 样式字符串它可以工作,但它不会传递 None 为 NULL 并抛出错误,开始认为这是 python 中 sybase 模块的限制。

cursor.execute("SELECT * FROM DB..table where app_name=@app_name", {"@app_name": app_name})
or
params = {"@appname": app.name. "@appver": app.version}
sql = "INSERT INTO DB..table (app_name, app_version) VALUES (@appname, @appversion)
cursor.execute(sql, params)

但是如果你有一个全局参数列表并将其提供给一个查询,如果有 None 那么它会再次给你很多关于 None 的错误,即使查询中未使用这些特定参数。我想我可能会在这里为多个选项做 IF 语句以绕过这个 None NULL 问题。

But got me to thinking is this not the same thing?

是的,它们实际上是一样的。他们都对注入攻击持开放态度。

相反,这样做:

query = "UPDATE DB..TABLE SET version = %s WHERE name = %s"
cursor.execute(query, [app.version, app.name])

好的,我现在已经解决了这个问题。 我必须更新 sybase 模块才能使其与 None > NULL.

一起工作

如更新后的问题中所述。下面是我是如何运行查询的。

cursor.execute("SELECT * FROM DB..table where app_name=@app_name", {"@app_name": app_name})
or
params = {"@appname": app.name. "@appver": app.version}
sql = "INSERT INTO DB..table (app_name, app_version) VALUES (@appname, @appversion)
cursor.execute(sql, params)