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_update
foi descontinuado desde 0,5 ou mais. session.add()
deve fazer isso.
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.