Liberar el manejo de TurboGears2 en DB específica (controlando el administrador de transacciones)

StackOverflow https://stackoverflow.com/questions/8369293

Pregunta

Estoy construyendo una aplicación TurboGears que funcione con 2 dB, la segunda, a la que me refiero es un MSSQL DB, utilizada por otra aplicación (no la mía, mi aplicación es en realidad un truco para resolver un problema, por lo que puedo 't Controle la otra aplicación o la configuración de MSSQL DB)

Estoy escribiendo en una tabla de DB específica con Sqlalchemy (a través de TurboGears) usando:

 DBSession.add(object)
 DBSession.flush()

Los datos se escriben en el DB, pero la aplicación TurboGears conserva algún tipo de manejo en el DB, por lo que la aplicación principal que usa esa tabla de DB puede leerlo pero no puede cambiarlo. Hasta que detenga la aplicación TurboGears y luego todo funciona. Traté de llamar:

DBSession.close()

Pero luego los datos se eliminaron mágicamente de la DB, probablemente una reversión de transacción. También intenté llamar:

transaction.doom()

con efectos similares (o sin ningún efecto en absoluto, no estoy seguro)

Leí que en TurboGears el gerente de transacciones (supongo que Repose.tm) maneja los compromisos pero no puedo entender, ¿cuándo se llama? ¿Cómo lo controlo? Y especialmente cómo eliminar el mango de DB cuando la función terminó, está programada (no puedo terminar el script, es un trabajo cron, ejecutándose cada hora). El TG2.1 DOCS no está claro en este tema

También leí en alguna parte que debería anular el commit_veto, pero no entendí, ¿cómo debería hacerlo y dónde? ¿Y en qué parte de mi aplicación debería llamar a la transacción.abort () .Doom () o lo que sea?

También probé las mismas funciones usando ganchos de transacción, pero no tuve éxito para llamar al gancho

Gracias por cualquier ayuda.

Datos de la versión:

  • TurboGears 2.1.3
  • Sqlalchemy 0.7
  • MSSQL 2005
  • Uso de pyodbc para conectarse a mssql
¿Fue útil?

Solución

DBSession.flush() Ejecuta SQL, pero no se compromete. Tienes que llamar DBSession.commit() Para finalizar la transacción (no es necesario llamar explícitamente flush() en este caso, commit() lo haré). Después commit() Sqlalchemy comienza una nueva transacción, pero esto no debería ser un problema ya que los datos generalmente se bloquean solo cuando ejecuta alguna declaración SQL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top