para - Python, “comandos fuera de sincronización; no puedes ejecutar este comando ahora "
python mysql install offline (4)
Esto no es un problema de python, sino un problema de mysql. Haga lo mismo desde Perl y obtendrá el mismo error. En general, veo ese mensaje cuando ejecuto una consola mysql, luego lo mato desde otra consola y luego intento ejecutar una consulta desde la consola eliminada.
Algo está matando tu conexión entre las declaraciones. Es probable que sea un error en su procedimiento. Revise su registro de errores mysql.
Tengo un procedimiento almacenado de MySQL que se ejecuta desde Python (envuelto en Django). Obtengo el error "comandos desincronizados; no puede ejecutar este comando ahora" cuando intento ejecutar la segunda instrucción. No puedo cometer la transacción en este punto. Esto es solo un problema cuando llamo a un procedimiento. ¿Qué hacer?
cursor.callproc(''my_mysql_procedure'', [some_id,])
result = cursor.fetchall()
for r in result:
do something
cursor.execute("select * from some_table")
result = cursor.fetchall()
EDITAR: Me han pedido que publique el procedimiento de MySQL. Lo he hecho super simple y sigo viendo el mismo problema.
delimiter $$
create procedure my_mysql_procedure(p_page_id int)
begin
select 1
from dual;
end$$
delimiter ;
Gracias a JoshuaBoshi por su respuesta, que resolvió el problema. Después de llamar al procedimiento, tuve que cerrar el cursor y abrirlo de nuevo antes de usarlo para ejecutar otra instrucción:
cursor.close()
cursor = connection.cursor()
El cursor se puede cerrar inmediatamente después de fetchall()
. El conjunto de resultados aún permanece y se puede recorrer en bucle.
La causa principal de esto son los resultados que no se toman del cursor antes de realizar una nueva consulta. Puede haber múltiples conjuntos de resultados.
Para detener el error, debe asegurarse de consumir el conjunto de resultados cada vez con .nextset. Si produce múltiples conjuntos de resultados, es posible que incluso tenga que hacer algunos de ellos.
cursor.callproc(''my_mysql_procedure'', [some_id,])
result = cursor.fetchall()
for r in result:
do something
cursor.nextset()
cursor.execute("select * from some_table")
result = cursor.fetchall()
En mi caso, descubrí que esto puede ser en realidad un indicador de otros problemas en las consultas de SQL que no se seleccionan como errores de Python hasta que se realiza una consulta posterior. Ellos produjeron múltiples conjuntos de resultados.
Aplicando esto a mi ejemplo a continuación (donde vi el mismo error),
>>> import MySQLdb
>>> conn = MySQLdb.connect(passwd="root", db="test")
>>> cur = conn.cursor()
>>> cur.execute("insert into foo values (1););")
1L
>>> cur.nextset()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 107, in nextset
nr = db.next_result()
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '')'' at line 1
Aquí, debido a que un error de análisis (algunos datos de entrada confiables, que se combinaron con el código) condujo a ese punto y coma y luego a una nueva declaración, esto produjo múltiples conjuntos de resultados. No producirá un error para esta declaración, sino para la siguiente que intenta ejecutar un comando en el cursor.
He hecho un repositorio github - https://github.com/odmsolutions/mysql_python_out_of_sync_demo - para demostrar y probar esto.
Respuesta original: mire https://github.com/farcepest/MySQLdb1/issues/28 para obtener detalles sobre cómo pude reproducir esto de manera confiable con 3 líneas de código:
Caso mínimo para reproducir esto: (suponga que tiene una base de datos en blanco y que ha creado solo una conexión a la base de datos, llamada conn)
>>> conn.query("Create table foo(bar int(11))")
>>> conn.query("insert into foo values (1););")
>>> conn.query("insert into foo values (2););")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can''t run this command now")
Es una mala sintaxis la que se generó y por el error no pude decir que ese era el problema.
Intente examinar la última consulta o procedimiento como sugiere Bukzor, e intente ejecutarlo en un cliente mysql sin formato para ver el problema real.
Me encontré con este error al ejecutar el siguiente código de Python (2.7):
def _execute(self, query, params, is_destructive):
try:
cursor = self.con.cursor()
cursor.execute(query, params)
if is_destructive:
self.con.commit()
return cursor.fetchall()
finally:
cursor.close()
El problema surgió de la llamada self.con.commit (). Estábamos a la defensiva y codificados para cometer operaciones destructivas (escritura) antes de cerrar el cursor. MySql no le gustaba esto. La eliminación de commit () llamado solucionó el problema y el script se ejecutó a través de cursor.fetchall ()