SQLAlchemy não atualizará meu banco de dados
Eu estou fazendo um aplicativo Pyramid usando o SQLAlchemy-0.7.8. Eu estou usando 64bit Python3.2.
A questão é, por que a seguinte função não compromete nada com o banco de dados?
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
Eu importo o DBSession de outro script. é definido da seguinte forma:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Veja algumas informações básicas:
O aplicativo que estou criando deve ser usado para caracterizar grandes blocos de HTML através do uso de expressões regulares. Se o aplicativo travar e achar que deve haver uma correspondência de cartão para um pedaço de texto, o usuário receberá um pequeno formulário para preencher. Assim que o formulário for confirmado, create_card será chamado. Se o curinga for correspondido à sequência, uma instância do WildCard será criada.
A classe WildCard não é nada especial, apenas armazena uma string e alguns inteiros. Se eu imprimir dCard, parece que o WildCard foi confirmado com sucesso porque tem um ID inteiro. Se eu não chamar flush na sessão de banco de dados, então dCard ['id'] é None.
o campo de id se parece com:
id = Column(Integer,Sequence('wild_seq'), primary_key=True)
As linhas add e flush causam a seguinte saída do console:
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)
Então, até este ponto, tudo está se comportando como é esperado.
Aqui está o problema: Mesmo que a instância do WildCard pareça ter sido confirmada no banco de dados, e nenhuma exceção foi levantada, o exame direto do banco de dados mostra que nenhuma alteração foi feita.
A substituição de flush () por commit () gera a seguinte exceção:
AssertionError: Transaction must be committed using the transaction manager