execute 或字符串 %s 传递的查询参数之间的区别

Difference between query's arguments passed by execute or by string %s

有人建议我使用以下代码:

query = 'Select "logtext" from log where jobid = %s;'
cursorErrorData.execute(query, str(row[0]))

而不是使用这个:

query = 'Select "logtext" from log where jobid = %s;' % str(row[0])
cursorErrorData.execute(query)

我使用了第一个例子,它工作正常,但在这个例子中它崩溃了。

str(row[0]) 检索到的数据如下:

3090

这是个例外:

not all arguments converted during string formatting

有人可以向我解释这两种方法之间的区别以及为什么在这种特殊情况下我不能使用它吗?

您需要在 cursor.execute 的第二个参数中传递一个 元组

例如:

query = 'Select "logtext" from log where jobid = %s;'
cursorErrorData.execute(query, (str(row[0],))    #-->tuple (str(row[0],)

execute 的第二个参数应该是一个参数序列。如果您提供 str(row[0]),那么它会被解释为一个序列,而不是单个参数。 (字符串是字符序列。)

将其包装在一个元组中。

cursorErrorData.execute(query, (str(row[0]),))