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 no flush()processo à medida que são gerados e nenhuma chamada para commit()deve ser necessária. Portanto, a resposta aqui está em um ou mais dos seguintes:
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:
f = Foo(bar=x)
session.add(f)
session.flush()
# At this point, the object f has been pushed to the DB,
# and has been automatically assigned a unique primary key id
f.id
# is None
session.refresh(f)
# refresh updates given object in the session with its state in the DB
# (and can also only refresh certain attributes - search for documentation)
f.id
# is the automatically assigned primary key ID given in the database.
É assim que se faz.
sessionmaker(autoflush=True), aquele combo w / refresh () me forneceu o ID da linha. #grrr
flush()e commit(), aqui está uma boa explicação: stackoverflow.com/a/4202016/1252290
flush()usar commit()e logo depois disso - atualize com session.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:
id = Column('ID', Integer, primary_key=True, nullable=False)
depois de modificado:
id = Column('ID', Integer, primary_key=True, autoincrement=True, nullable=True)
então
session.flush()
print(f.id)
está ok!
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.
Você deve tentar usar em session.save_or_update(f)vez de session.add(f).
save_or_updatefoi descontinuado desde 0,5 ou mais. session.add()deve fazer isso.
echo=Truee 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.