使用 Python 进行 SQL 查询中的字符串替换

Posted

技术标签:

【中文标题】使用 Python 进行 SQL 查询中的字符串替换【英文标题】:String replacement in SQL Query using Python 【发布时间】:2014-11-20 11:25:54 【问题描述】:

我在 SQL 中有两个查询,如下所示:

q1 = select date_hour from table

而且,第二个查询是:

q2 = select date(date_hour) from table

这些查询之间的唯一区别是字符串 date_hourdate(date_hour)。所以,我尝试用以下方式参数化我的查询:

q1 = select %s from table
cur.execute(q1,'date')
cur.execute(q1,'date(date_hour)')

但是,这会引发错误:

not all arguments converted during string formatting

为什么会出现此错误?我该如何解决?

【问题讨论】:

【参考方案1】:

cur.execute中的逗号改为%

改变这个:

q1 = "select %s from table"
cur.execute(q1,'date')
cur.execute(q1,'date(date_hour)')

到:

q1 = "select %s from table"
cur.execute(q1 % 'date')
cur.execute(q1 % 'date(date_hour)')

【讨论】:

【参考方案2】:

目前尚不清楚您使用的是哪个 sql 库,但假设它使用 Python DB API:

Sql 参数通常用于值,而不是列名(虽然这可以使用存储过程)。

您似乎对 python 中的字符串格式和 sql 参数化查询感到困惑。

虽然 %s 可用于格式化字符串(请参阅formatting strings),但这不是设置 sql 参数的方法。

查看this response在python中使用sql参数。

顺便说一句,我看不出这个简单的代码有什么问题:

cursor=cnx.curor()
query="select date_hour from table"
cursor.execute(query)
query="select date(date_hour) from table"
cursor.execute(query)

【讨论】:

我不希望同一个查询被写两次。这两个查询除了一个不同外完全相同。这就是为什么,我想参数化它们。 正如我所说的,参数用于值而不是列名。不过,如果您真的坚持使用相同的字符串,这应该可以解决问题:cur.execute('select %s from table1' % 'date_hour')【参考方案3】:

把你的代码改成这样:

q1 = "select %s from table" cur.execute(q1,['date']) cur.execute(q1,['date(date_hour)'])

查看this

【讨论】:

以上是关于使用 Python 进行 SQL 查询中的字符串替换的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 和 mySQL 进行动态 SQL 查询

使用 FROM 子句中的子查询进行联接操作中的 SQL 语法错误

python中的mysql数据库like模糊查询

在Python中将sql查询存储为单个变量[重复]

尽量不在 SQL 查询中硬编码日期范围(Python、SQL 服务器)

使用 Linq Skip Take 进行传统 SQL 查询,而不是使用 RowNum