sqlalchemy, postgresql y la relación se trabaron en “inactivo en transacción”

Tengo un problema relacionado con sqlalchemy y postgresql.

class Profile(Base): ... roles = relationship('Role', secondary=role_profiles, backref='profiles', lazy='dynamic') 

Cuando se ejecuta ( current_user es una instancia de la clase Profile ):

 roles = current_user.roles.filter().all() 

Al usar sqlalchemy, me quedo idle in transaction para todas las selecciones para leer el perfil en postgresql.

Editar:

De hacerme eco de la consulta veo que cada selección comienza con:

 BEGIN (implicit) 

Otra edición:

Después de agregar

 pool_size=20, max_overflow=0 

Para el create_engine parece que la idle in transaction -las declaraciones se retrotraen cuando la cantidad de inactividad se está volviendo demasiado grande. ¿Alguna idea sobre esto y sería una mala solución al problema?

¿Cómo manejo esto y cómo me desharía de BEGIN for selects?

A partir de SQLAlchemy 0.8.2 puede deshabilitar las instrucciones BEGIN implícitas al llamar a create_engine()

 engine = create_engine(uri, isolation_level="AUTOCOMMIT") 

Hay algunas implicaciones sutiles para este cambio. Primero, las declaraciones que no se hayan ocultado silenciosamente en una transacción no terminada serán ignoradas silenciosamente

 session.execute("DELETE FROM department WHERE department_id=18") sys.exit(0) 

por defecto :

 LOG: statement: BEGIN LOG: statement: show standard_conforming_strings LOG: statement: DELETE FROM department WHERE department_id=18 LOG: unexpected EOF on client connection with an open transaction 

confirmación automática :

 LOG: statement: show standard_conforming_strings LOG: statement: DELETE FROM department WHERE department_id=18 

En segundo lugar, la actualización de varias actualizaciones ya no es automática, y rollback() solo es condicionalmente efectivo:

 department = Department(u"HR") session.add(department) session.flush() employee = Employee(department.department_id, u'Bob') session.add(employee) session.rollback() 

por defecto :

 LOG: statement: BEGIN LOG: statement: INSERT INTO department (name) VALUES ('HR') RETURNING department.department_id LOG: statement: ROLLBACK 

confirmación automática :

 LOG: statement: INSERT INTO department (name) VALUES ('HR') RETURNING department.department_id 

La configuración del nivel de isolation_level de SQLAlchemy en el objeto Engine es efectiva para muchas aplicaciones. Es desafortunado que Session.begin() no siempre signifique BEGIN TRANSACTION;

SQLA por defecto siempre opera en una transacción (alguna información aquí ). En un contexto web, la mayoría de los marcos de trabajo manejarían la confirmación de esta transacción al final de la solicitud (por ejemplo, pyramid_tm ). Si no está utilizando un marco, o este es otro tipo de aplicación, querrá confirmar o revertir cuando termine, o en un punto apropiado.

Puede ser posible configurar SQLA de tal manera que no inicie automáticamente una transacción pero, por lo que puedo ver, no es la forma en que está diseñada para ser utilizada, por lo que probablemente tenga más suerte de no intentar luchar contra ella :).