生成查询字符串时出现Python类型错误

2024-06-13 21:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个查询字符串。在

query = "SELECT seqid, date, name, steamid, team, text, type, '%s' as triggerword, '%s' as weight FROM chatlogs WHERE date > '%s' AND text LIKE '%%%s%%' ORDER BY DATE" % (word, weight, self.setting['LAST_RUN_TIME'], word)

如果我打印字符串,它将正确返回:

^{pr2}$

但是,它会失败,并出现一个TypeError异常: TypeError:格式字符串的参数不足

完整代码:

import database

mysqldb = database.Connection('localhost','mydb',user='myuser',password='mypass')

word = 'hunting_term'
weight = 0.01
setting = dict({'LAST_RUN_TIME':'2012-04-18 23:47:58.439124'})

query = "SELECT seqid, date, name, steamid, team, text, type, '%s' as triggerword, '%s' as weight FROM chatlogs WHERE date > '%s' AND text LIKE '%%%s%%' ORDER BY DATE" % (word, weight, setting['LAST_RUN_TIME'], word)
print query

for message in mysqldb.query(query):        # This is the line it throws the exception on
    print "A row"

数据库来自tornado


Tags: run字符串textnamedatetimeasquery
1条回答
网友
1楼 · 发布于 2024-06-13 21:37:49

这里的问题是,对MySQLdb的最终调用如下所示:

query = "SELECT seqid, date, name, steamid, team, text, type, 'hunting_term' as triggerword, '0.01' as weight FROM chatlogs WHERE date > '2012-04-18 23:47:58.439124' AND text LIKE '%hunting_term%' ORDER BY DATE"
db.cursor().execute(query, ())

db.cursor().execute()的第一个参数应该是一个格式字符串,第二个参数应该是该格式字符串的替换项,您可以在MySQLdb docs中看到这一点。换句话说,它将执行以下代码:

^{pr2}$

如您所见,这将导致相同的类型错误:

>>> query % ()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string

这意味着您希望MySQL看到的任何文本%在被db.cursor().execute()看到时都必须是%%,因此您应该能够通过将原始格式字符串更改为以下内容来解决此问题:

query = "SELECT seqid, date, name, steamid, team, text, type, '%s' as triggerword, '%s' as weight FROM chatlogs WHERE date > '%s' AND text LIKE '%%%%%s%%%%' ORDER BY DATE" % (word, weight, self.setting['LAST_RUN_TIME'], word)

但是,正确的方法是让MySQLdb为您执行替换,这会将您的代码更改为以下代码:

query = "SELECT seqid, date, name, steamid, team, text, type, %s as triggerword, %s as weight FROM chatlogs WHERE date > %s AND text LIKE %s ORDER BY DATE"
parameters = (word, weight, setting['LAST_RUN_TIME'], '%%%s%%' % word)
for message in mysqldb.query(query, *parameters):
    print "A row"

相关问题 更多 >