remove queries delete binds python sqlalchemy pyramid

python - queries - sqlalchemy documentation



¿Cuándo debo llamar a flush() en SQLAlchemy? (1)

La ZopeTransactionExtension en DBSession junto con pyramid_tm está activo en su proyecto manejará todos los commits por usted. Las situaciones en las que necesita enjuagar son:

  • Desea crear un nuevo objeto y recuperar la clave principal.

    DBSession.add(obj) DBSession.flush() log.info(''look, my new object got primary key %d'', obj.id)

  • Desea intentar ejecutar algún SQL en un punto de rescate y deshacer si falla sin invalidar la transacción completa.

    sp = transaction.savepoint() try: foo = Foo() foo.id = 5 DBSession.add(foo) DBSession.flush() except IntegrityError: log.error(''something already has id 5!!'') sp.rollback()

En todos los demás casos que impliquen el ORM, la transacción se cancelará por usted en caso de excepción, o se comprometerá en caso de éxito automáticamente por pyramid_tm . Si ejecuta SQL sin formato, deberá ejecutar transaction.commit() usted mismo o marcar la sesión como sucia a través de zope.sqlalchemy.mark_changed(DBSession) contrario, no habrá forma de que el ZTE sepa que la sesión ha cambiado.

También debe dejar expire_on_commit en el valor predeterminado de True menos que tenga una razón realmente buena.

Soy nuevo en SQLAlchemy y heredé una base de código algo desordenada sin acceso al autor original.

El código está escrito con llamadas a DBSession.flush() , aparentemente cada vez que el autor quería asegurarse de que se estaban DBSession.flush() datos. Al principio solo estaba siguiendo los patrones que vi en este código, pero cuando estoy leyendo documentos, parece que no es necesario, que el autoflushing debe estar en su lugar. Además, he estado en algunos casos con llamadas AJAX que generan el error "InvalidRequestError: Session ya está descargando".

¿Bajo qué escenarios legítimamente querría mantener una llamada para flush ()?

Esta es una aplicación Pyramid, y SQLAlchemy se está configurando con:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension(), expire_on_commit=False)) Base = declarative_base()