Por que liberar se você pode confirmar?
Como alguém novo no trabalho com bancos de dados e sqlalchemy, as respostas anteriores - que flush()
enviam instruções SQL ao banco de dados e as commit()
persistem - não estavam claras para mim. As definições fazem sentido, mas não fica claro imediatamente a partir das definições por que você usaria um flush em vez de apenas confirmar.
Como um commit sempre libera ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ), esses sons são realmente semelhantes. Eu acho que o grande problema a destacar é que um flush não é permanente e pode ser desfeito, enquanto um commit é permanente, no sentido de que você não pode pedir ao banco de dados para desfazer o último commit (eu acho)
O @snapshoe destaca que, se você deseja consultar o banco de dados e obter resultados que incluam objetos recém-adicionados, você precisa primeiro liberar (ou confirmar, o que liberará para você). Talvez isso seja útil para algumas pessoas, embora eu não saiba por que você desejaria liberar em vez de confirmar (além da resposta trivial de que pode ser desfeita).
Em outro exemplo, eu estava sincronizando documentos entre um banco de dados local e um servidor remoto e, se o usuário decidisse cancelar, todas as adições / atualizações / exclusões deveriam ser desfeitas (ou seja, sem sincronização parcial, apenas uma sincronização completa). Ao atualizar um único documento, decidi simplesmente excluir a linha antiga e adicionar a versão atualizada do servidor remoto. Acontece que, devido à maneira como o sqlalchemy é gravado, a ordem das operações ao confirmar não é garantida. Isso resultou na adição de uma versão duplicada (antes de tentar excluir a antiga), o que resultou na falha do banco de dados em uma restrição exclusiva. Para contornar isso, usei flush()
para que a ordem fosse mantida, mas ainda assim eu poderia desfazer se o processo de sincronização falhar mais tarde.
Veja meu post sobre isso em: Existe alguma ordem para adicionar versus excluir ao confirmar em sqlalchemy
Da mesma forma, alguém queria saber se a ordem de adição é mantida ao confirmar, ou seja, se eu adicionar e object1
depois adicionar object2
, ela será object1
adicionada ao banco de dados antes do object2
SQLAlchemy salvar a ordem ao adicionar objetos à sessão?
Novamente, aqui presumivelmente o uso de um flush () garantiria o comportamento desejado. Portanto, em resumo, um uso para o flush é fornecer garantias de pedidos (eu acho), novamente enquanto ainda se permite uma opção "desfazer" que o commit não fornece.
Autoflush e Autocommit
Observe que o autoflush pode ser usado para garantir que as consultas atuem em um banco de dados atualizado, pois o sqlalchemy será liberado antes de executar a consulta. https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
A confirmação automática é outra coisa que eu não entendo completamente, mas parece que seu uso é desencorajado:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params. confirmação automática
Uso de memória
Agora, a pergunta original realmente queria saber sobre o impacto do flush vs. commit para fins de memória. Como a capacidade de persistir ou não é algo que o banco de dados oferece (eu acho), a simples descarga deve ser suficiente para ser transferida para o banco de dados - embora a confirmação não seja prejudicial (na verdade, provavelmente ajuda - veja abaixo) se você não se importa em desfazer .
O sqlalchemy usa referências fracas para objetos que foram liberados: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-behavior
Isso significa que se você não tiver um objeto explicitamente mantido em algum lugar, como em uma lista ou ditado, o sqlalchemy não o manterá na memória.
No entanto, você precisa se preocupar com o lado do banco de dados. Presumivelmente, a liberação sem confirmar vem com alguma penalidade de memória para manter a transação. Novamente, sou novo nisso, mas aqui está um link que parece sugerir exatamente isso: https://stackoverflow.com/a/15305650/764365
Em outras palavras, as confirmações devem reduzir o uso de memória, embora presumivelmente haja uma troca entre memória e desempenho aqui. Em outras palavras, você provavelmente não deseja confirmar todas as alterações no banco de dados, uma de cada vez (por motivos de desempenho), mas esperar muito tempo aumentará o uso de memória.