El inserto no funciona para la sesión de la base de datos SQLAlchemy

¿Por qué no se está insertando un registro? Se devolvió una identificación, pero cuando verifico la base de datos no hay un nuevo registro.

Desde models.py

from zope.sqlalchemy import ZopeTransactionExtension DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 

Y views.py

 DBSession.execute(text('INSERT INTO (a,b,c) VALUES (\'a\',\'b\',\'c\') RETURNING id'), params=dict(a=a,b=b,c=c)) 

He intentado comprometerme con transaction.commit() que no recibe un error pero no inserta un registro. result.fetchone()[0] está obteniendo un ID.

Y DBSession.commit que obtiene

 assert self.transaction_manager.get().status == ZopeStatus.COMMITTING, "Transaction must be committed using the transaction manager" 

Esto se debe a que no está utilizando ORM para insertar nuevas filas, por lo que la transacción no sabe que debe comprometerse por sí misma, porque el estado de la transacción no está marcado como sucio.

Coloque el siguiente código después de que DBSession.execute la consulta en su views.py.

 from zope.sqlalchemy import mark_changed session = DBSession() session.execute(...your query...) mark_changed(session) 

En este punto, la transacción debe poder confirmar correctamente su consulta, o usar ORM para insertar la nueva fila.

Aquí hay un poco más sobre este tema:

https://pypi.python.org/pypi/zope.sqlalchemy/0.7.4#id15

De forma predeterminada, zope.sqlalchemy coloca las sesiones en un estado ‘activo’ cuando se usan por primera vez. Las operaciones de escritura ORM mueven automáticamente la sesión a un estado ‘cambiado’. Esto evita las confirmaciones de base de datos innecesarias. A veces es necesario interactuar con la base de datos directamente a través de SQL. No es posible adivinar si una operación de este tipo es una lectura o una escritura. Por lo tanto, debemos marcar manualmente la sesión como cambiada cuando las instrucciones SQL manuales escriben en la base de datos.

tratar

 DBSession.flush() 

despues de ejecutar