Estoy tratando de recorrer una consulta MySQL, sin embargo, no puedo hacer que la variable funcione. ¿Qué estoy haciendo mal? El ciclo comienza en la línea 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()

Mensaje de error:

Archivo "james_test.py", línea 114, en '' ', (i)) Archivo "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", línea 187, en ejecutar consulta = consulta% tupla ([db.literal (item) para item en args]) TypeError: el objeto 'int' no es iterable

2
James Eaves 11 dic. 2015 a las 10:15

3 respuestas

La mejor respuesta

Así es como haría esto. Es posible que no necesite declarar 2 cursores, pero no hará daño a nada. A veces es necesario un segundo cursor porque podría haber un conflicto. Observe cómo demuestro 2 métodos diferentes para recorrer los datos del cursor. Uno con el fetchall y otro girando el cursor. Un tercer método podría usar fetch, pero no se muestra. El uso de un cursor de diccionario es realmente agradable, pero a veces es posible que desee usar un cursor estándar sin dict donde los valores se recuperan solo por su número en la matriz de filas. También tenga en cuenta la necesidad de usar una coma final en la lista de parámetros cuando solo tiene 1 parámetro. Porque espera una tupla. Si tiene más de 1 parámetro, no necesitará una coma final porque más de 1 parm será una tupla.

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"]
1
panofish 12 dic. 2015 a las 04:56

Quizás intente esto:

a = '''this is the {try_}. try'''
i= 1    
b = a.format(try_=i)
print b

Incluso podrías hacer:

data = {'try_':i}
b = a.format(**data)

Fuentes:

función ".format" de Python

Formato de cadena de Python:% vs.formato

0
rocksteady 11 dic. 2015 a las 07:44

cur.execute espera un tuple o dict para los parámetros, pero le diste (i) que es un int no un tuple. Para convertirlo en tuple agregue una coma (i,)

2
BigOther 11 dic. 2015 a las 07:26