因为题主并未提及连接数据库用的哪个库,所以假设你使用的是mysqldb。
可以看一下mysqldb的源码:
...
def execute(self, query, args=None):
"""
...
args -- optional sequence or mapping, parameters to use with query.
...
"""
if args is not None:
# 首先判断args是否为字典类型
if isinstance(args, dict):
# 以k-v形式填入查询语句中。
query = query % dict((key, db.literal(item))
for key, item in args.iteritems())
# 当args为非字典类型时
else:
# 遍历args, 最后生成一个元组填入查询语句中。
query = query % tuple([db.literal(item) for item in args])
...
可以看到,args参数为一个可选的序列或者映射,即args参数的期望类型是list或者tuple。
那么回头再看一下你给的输入参数:
>>> name = 'test'
>>> type(name)
>>> type((name))
>>> type(('name', 1))
所以,解决方法很简单:
>>> type((name, ))
>>> cursor.execute('select * from tb where name=%s',(name, ))
1L
这里就涉及到一个小细节。
当创建只有一个元素的元组时,需要加一个逗号,否则解释器会当作一个字符串创建。