如何使用 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 查询?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ajax 方法将变量传递给 python

如何将变量的值传递给python中的import语句

使用 python socketserver 如何将变量传递给处理程序类的构造函数

气流 - 如何将 xcom 变量传递给 Python 函数

如何将两个变量传递给 python 函数并返回两个变量? [复制]

如何将 Bash 变量传递给 Python?