【问题标题】:How to pass variable into MySQLdb query with Python?如何使用 Python 将变量传递给 MySQLdb 查询?
【发布时间】: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' 对象不可迭代

【问题讨论】:

    标签: python mysql loops


    【解决方案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,)

      【讨论】:

        猜你喜欢
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多