tutorial remove query queries delete python sqlalchemy pyramid python-3.2

python - remove - sqlalchemy query



SQLAlchemy no actualizará mi base de datos (1)

Estoy haciendo una aplicación Pyramid usando SQLAlchemy-0.7.8. Estoy usando 64bit Python3.2.

La pregunta es, ¿por qué la siguiente función no compromete nada a la base de datos?

def create_card(sText,sCard): """ create a wildcard instance if all is well (ie,sCard match in sText) return oCard, dCard otherwise return False,False """ oMatch = re.search(sCard,sText) if oMatch: oCard = WildCard() #set up some stuff about the WildCard DBSession.add(oCard) DBSession.flush() dCard = { ''id'' : oCard.id, ''span'' : oMatch.span(), ''card'' : oCard.card_string, } return oCard,dCard return False,False

Importe DBSession de otra secuencia de comandos. se define de la siguiente manera:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

Aquí hay alguna información de fondo:

La aplicación que estoy creando se usará para caracterizar grandes bloques de HTML mediante el uso de expresiones regulares. Si la aplicación se atasca y cree que debe haber una coincidencia de tarjeta inteligente para una pieza de texto, entonces se le dará al usuario una pequeña forma para completar. Una vez que se ha confirmado el formulario, se llama create_card. Si el comodín se compara con la cadena, se crea una instancia de WildCard.

La clase WildCard no es nada especial, solo almacena una cadena y algunos enteros. Si imprimo dCard, parece que la WildCard se ha confirmado correctamente porque tiene una identificación entera. Si no llamo "flush" en la sesión de la base de datos, dCard [''id''] es None.

el campo de identificación se ve así:

id = Column(Integer,Sequence(''wild_seq''), primary_key=True)

Las líneas de adición y descarga causan la siguiente salida de consola:

2012-09-16 12:30:34,845 INFO [sqlalchemy.engine.base.Engine][Dummy-2] INSERT INTO wildcard_wildcards (card_string, range_id, brand_id, category_id, group_cat_map_id, heading_group_id, heading_to_grp_map_id, heading_id, value_map_id, igneore_match) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 2012-09-16 12:30:34,845 INFO [sqlalchemy.engine.base.Engine][Dummy-2] (''sCard contents'', None, None, None, None, None, None, None, None, 0)

Hasta este punto, todo se está comportando como se esperaba.

Este es el problema: a pesar de que la instancia de WildCard parece haber sido comprometida con la base de datos, y no se han producido excepciones, el examen directo de la base de datos muestra que no se han realizado cambios.

reemplazar flush () con commit () genera la siguiente excepción:

AssertionError: Transaction must be committed using the transaction manager


Debes comprometer tu transacción.

Puede hacerlo de forma explícita (llamando a DBSession.commit() o utilizando el middleware pyramid_tm , este último realiza transacciones automáticamente en las respuestas exitosas (con una respuesta HTTP 2xx).

Este último solo realiza transacciones para SQLAlchemy si usa la extensión ZopeTransactionExtension con su creador de sesión:

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

Si ya está utilizando ZopeTransactionExtension y desea confirmar sus transacciones explícitamente, debe usar el paquete de transaction : transacción de importación

transaction.commit()