如何使用 Python 将变量传递给 MySQLdb 查询?
Posted
技术标签:
【中文标题】如何使用 Python 将变量传递给 MySQLdb 查询?【英文标题】:How to pass variable into MySQLdb query with Python? 【发布时间】:2016-03-17 00:58:30 【问题描述】:我正在尝试遍历 mysql 查询,但是我无法让变量工作。我究竟做错了什么?循环从第 10 行开始。
cur = db.cursor()
query = '''
Select user_id, solution_id
From user_concepts
Where user_id IN
(Select user_id FROM fields);
'''
cur.execute(query)
numrows = cur.rowcount
for i in xrange(0,numrows):
row = cur.fetchone()
# find all item_oid where task_id = solution_id for first gallery and sort by influence.
cur.execute('''
SELECT task_id, item_oid, influence
FROM solution_oids
WHERE task_id = row[%d]
ORDER BY influence DESC;
''', (i))
cur.fetchall()
错误信息:
文件“james_test.py”,第 114 行,在 ''',(i)) 文件“/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py”,第 187 行,在执行中 query = query % tuple([db.literal(item) for item in args]) TypeError: 'int' 对象不可迭代
【问题讨论】:
【参考方案1】:我会这样做。您可能不需要声明 2 个游标,但它不会伤害任何东西。有时需要第二个游标,因为可能存在冲突。请注意我如何演示 2 种不同的循环游标数据的方法。一种是使用 fetchall,另一种是通过循环游标。第三种方法可以使用 fetch,但未显示。使用字典游标非常好,但有时您可能希望使用标准的非字典游标,其中值仅通过它们在行数组中的编号检索。另请注意,当您只有 1 个参数时,需要在参数列表中使用尾随逗号。因为它需要一个元组。如果您有超过 1 个参数,则不需要尾随逗号,因为超过 1 个参数将是一个元组。
cursor1 = db.cursor(MySQLdb.cursors.DictCursor) # a dictcursor enables a named hash
cursor2 = db.cursor(MySQLdb.cursors.DictCursor) # a dictcursor enables a named hash
cursor1.execute("""
Select user_id, solution_id
From user_concepts
Where user_id IN (Select user_id FROM fields);
"""
for row in cursor1.fetchall():
user_id = row["user_id"]
solution_id = row["solution_id"]
cursor2.execute("""
SELECT task_id, item_oid, influence
FROM solution_oids
WHERE task_id = %s
ORDER BY influence DESC;
""", (solution_id,))
for data in cursor2:
task_id = data["task_id"]
item_oid = data["item_oid"]
influence = data["influence"]
【讨论】:
这对我的帮助远不止我的问题。非常感谢。【参考方案2】:不妨试试这个:
a = '''this is the try_. try'''
i= 1
b = a.format(try_=i)
print b
你甚至可以这样做:
data = 'try_':i
b = a.format(**data)
来源:
python's ".format" function
Python string formatting: % vs. .format
【讨论】:
【参考方案3】:cur.execute
期望 tuple
o dict
用于参数,但您给出的 (i)
是 int
而不是 tuple
。要使其成为tuple
,请添加逗号(i,)
【讨论】:
以上是关于如何使用 Python 将变量传递给 MySQLdb 查询?的主要内容,如果未能解决你的问题,请参考以下文章
使用 python socketserver 如何将变量传递给处理程序类的构造函数