python和使用变量准备的sql语句

anhgbhbe  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(414)

我对python还比较陌生,但有一个项目我正在工作,所以请原谅我的任何诞生。我正在用Python2.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(在python中为none),否则它显然会将“null”作为字符串插入。
对于这个特定的示例,这两个变量是从configparser读取的文件中设置的,但我认为argparse变量仍然是相同的。例如

[SECTION]
application=name
version=1.0

我不太确定如何最好地解决这个问题,是的,我知道“python3最好升级到它”,正如我在开始时所说的,这些库正在移植过程中。
如果你需要任何额外的信息,请告知,我会给你最好的我可以。
使用我在一些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语句的各种选项在这里的多个插入绕过这个非空的问题。

lokaqttq

lokaqttq1#

好的,我现在已经解决了这个问题。我必须更新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)
9avjhtql

9avjhtql2#

但让我想到的是这不是一回事?
是的,实际上是一样的。他们都很容易受到注射攻击。
相反,要这样做:

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

相关问题