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
3 respuestas
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"]
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:
Formato de cadena de Python:% vs.formato
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,)