Eu quero fazer algo assim:
f = Foo(bar='x')
session.add(f)
session.flush()
# do additional queries using f.id before commit()
print f.id # should be not None
session.commit()
Mas f.id
é None
quando eu tento. Como posso fazer isso funcionar?
python
sqlalchemy
Eloff
fonte
fonte
echo=True
e ver qual SQL é executado no tempo de liberação? O que você descreve deve funcionar e fornecer o id, mas pode haver algum outro problema que resulta em f.id sendo Nenhum.Respostas:
Seu código de amostra deve ter funcionado como está. SQLAlchemy deve fornecer um valor para
f.id
, supondo que seja uma coluna de chave primária de geração automática. Os atributos de chave primária são preenchidos imediatamente noflush()
processo à medida que são gerados e nenhuma chamada paracommit()
deve ser necessária. Portanto, a resposta aqui está em um ou mais dos seguintes:fonte
Acabei de encontrar o mesmo problema e, após o teste, descobri que NENHUMA dessas respostas é suficiente.
Atualmente, ou a partir de sqlalchemy .6+, há uma solução muito simples (não sei se isso existe na versão anterior, embora eu imagine que sim):
session.refresh ()
Portanto, seu código seria mais ou menos assim:
É assim que se faz.
fonte
sessionmaker(autoflush=True)
, aquele combo w / refresh () me forneceu o ID da linha. #grrrflush()
ecommit()
, aqui está uma boa explicação: stackoverflow.com/a/4202016/1252290flush()
usarcommit()
e logo depois disso - atualize comsession.refresh(f)
, funciona para mim e eu uso a versão SQLAlchemy0.6.7
Obrigado a todos. Resolvi meu problema modificando o mapeamento da coluna. Para mim,
autoincrement=True
é obrigatório.origem:
depois de modificado:
então
está ok!
fonte
ao contrário da resposta dada por dpb, uma atualização não é necessária. depois de liberar, você pode acessar o campo id, sqlalchemy automaticamente atualiza o id que é gerado automaticamente no backend
Eu encontrei esse problema e descobri o motivo exato após alguma investigação, meu modelo foi criado com id como integerfield e no meu formulário o id foi representado com hiddenfield (já que eu não queria mostrar o id no meu formulário). O campo oculto é, por padrão, representado como um texto. assim que mudei o formulário para integerfield com widget = hiddenInput ()) o problema foi resolvido.
fonte
Certa vez, tive um problema com a atribuição
0
de id antes de chamar osession.add
método. O id foi atribuído corretamente pelo banco de dados, mas o id correto não foi recuperado da sessão posteriorsession.flush()
.fonte
Você deve tentar usar em
session.save_or_update(f)
vez desession.add(f)
.fonte
save_or_update
foi descontinuado desde 0,5 ou mais.session.add()
deve fazer isso.