tables postgres in_ create and python mysql sqlalchemy locking

in_ - sqlalchemy python postgres



SQLAlchemy sesión y relación de conexión (1)

"solo funcionará" si (a) su sesión es una scoped_session y (b) la está usando de forma no simultánea (el mismo pid / thread). Si eres demasiado paranoico, asegúrate de que estés utilizando la misma ID de conexión a través de

session.connection().connection.thread_id()

Además, no tiene sentido pasar la sesión como argumento. Inítelo una vez, en algún lugar del alcance global de su aplicación, luego llame a cualquier parte de un código, obtendrá la misma ID de conexión.

¿Las consultas ejecutadas con el mismo objeto de session SQLAlchemy utilizan la misma conexión subyacente? Si no, ¿hay alguna manera de asegurar esto?

Algunos antecedentes: tengo la necesidad de utilizar la función de bloqueo con nombre de MySQL, es decir, las funciones GET_LOCK() y RELEASE_LOCK() . En lo que respecta al servidor MySQL, solo la conexión que obtuvo el bloqueo puede liberarlo, así que debo asegurarme de que ejecuto estos dos comandos dentro de la misma conexión o la conexión muere para asegurar que se libere el bloqueo.

Para hacer las cosas más agradables, he creado un contexto "bloqueado" así:

@contextmanager def mysql_named_lock(session, name, timeout): """Get a named mysql lock on a session """ lock = session.execute("SELECT GET_LOCK(:name, :timeout)", name=name, timeout=timeout).scalar() if lock: try: yield session finally: session.execute("SELECT RELEASE_LOCK(:name)", name=name) else: e = "Count not obtain named lock {} within {} sections".format( name, timeout) raise RuntimeError(e) def my_critical_section(session): with mysql_named_lock(session, __name__, 10) as lockedsession: thing = lockedsession.query(MyStuff).one() return thing

Quiero asegurarme de que las dos llamadas de execute en mysql_named_lock ocurran en la misma conexión subyacente o que la conexión esté cerrada.

¿Puedo asumir que esto "solo funcionará" o hay algo de lo que tenga que estar al tanto aquí?