SQLAlchemy no actualizará mi base de datos

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 confirma nada en 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 desde otro script. Se define de la siguiente manera:

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

Aquí hay algo de información de fondo:

La aplicación que estoy creando debe usarse para caracterizar grandes bloques de HTML mediante el uso de expresiones regulares. Si la aplicación se atasca y cree que debería haber una coincidencia de wilcard para un trozo de texto, se le da al usuario un pequeño formulario para completar. Una vez que se confirma el formulario, se llama a create_card. Si el comodín coincide 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 confirmó correctamente porque tiene un ID entero. Si no llamo flush en la sesión de la base de datos, entonces dCard ['id'] es None.

el campo de identificación se ve como:

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

Las líneas de agregar y vaciar 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)

Así que hasta este punto todo se está comportando bastante como se espera.

Aquí está el problema: a pesar de que parece que la instancia de WildCard se ha confirmado en la base de datos, y no se generan 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

Respuestas a la pregunta(1)

Su respuesta a la pregunta