queries one delete datatypes python mysql session sqlalchemy locking

python - one - queries sqlalchemy



Ignorar bloqueo en la base de datos MYSQL en Sqlalchemy Query (1)

Usando SQLAlchemy para consultar una base de datos MySQL, recibo el siguiente error:

sqlalchemy.exc.OperationalError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely) (_mysql_exceptions.OperationalError) (1205, ''Lock wait timeout exceeded; try restarting transaction'')

En primer lugar, supongo que el comentario del mensaje de error para "considerar el uso de un bloque session.no_autoflush si este borrado está ocurriendo prematuramente" se trata de la otra sesión que coloca el bloqueo, no de la sesión que estoy usando para mi consulta actual. Si sigo este consejo, ¿esto ayudaría a evitar bloqueos en la base de datos en general? En segundo lugar, solo necesito leer y no necesito escribir modificaciones en los resultados de la consulta, por lo que me gustaría saber cómo ignorar el bloqueo y solo leer lo que está actualmente en la base de datos. Creo que el sql es NOWAIT, pero no veo cómo hacerlo en la API sqlalchemy.


Suponiendo que está utilizando mysql.connector , el valor predeterminado de la propiedad autocommit es False, lo que puede hacer que el script se cuelgue debido a otra sesión que está esperando terminar.

SQLAlchemy está utilizando las instrucciones BEGIN , (alias de START TRANSACTION ) que hacen que la sesión adquiera LOCK de la tabla / base de datos, y su conexión esperará hasta que se apruebe el bloqueo.

Para superar este comportamiento (y debido al hecho de que dijiste que solo necesitas LEER datos durante la sesión) puedes establecer autocommit = True al crear tu sesión:

Session = sessionmaker(bind=engine, autocommit=True)

Otra opción: después de crear la sesión, puede ejecutar SET AUTOCOMMIT=1 :

s = Session() s.execute("SET AUTOCOMMIT=0")

También puede intentar establecer la propiedad autocommit directamente en la cadena de conexión:

engine = create_engine("mysql+mysqlconnector://user:pass@localhost/dbname?autocommit=1")

Sin embargo, no lo probé. De acuerdo con la documentación, debería funcionar.