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í?