💧🔎⏳Elixir: 사전 로드와 사전 로드를 사용하는 것과 다른 점은 무엇입니까?

Vamos usar o projeto do post para fazermos uns testes com os comentários e observar o comportamento de usar só preload e preload com join.

Vamos buscar os posts com seus commentários:

예를 들어 com preload




from(p in Post, preload: [:comments]) |> Repo.all()




Post
|> preload([:comments])
|> Repo.all


결과:



예를 들어 acima buscou todas as postagens do banco de dados e, em seguida, fez uma Consulta separada retornando todos os comentários associados às postagens fornecidas. Os comentários foram processados ​​e associados a cada post sendo retornados no campo comments .

관찰자 폰토스:
  • Nenhum registro apareceu duplicado.
  • Todos os posts apareceram, mesmo os posts sem comentários.

  • Exemplo com preload e 조인



    Muitas vezes, você pode querer que postagens e comentários sejam selecionados e filtrados na mesma Consulta. Para esses casos, você pode dizer 명시적 que uma junção existente seja pré-carregada no conjunto de resultados:

    Repo.all(
          from p in Post,
            join: c in assoc(p, :comments),
            preload: [comments: c]
        )
    




    Post
    |> join(:inner, [p], c in assoc(p, :comments))
    |> preload([:comments])
    |> Repo.all()
    
    # ou
    
    Post
    |> join(:inner, [p], c in Comment, on: p.id == c.post_id)
    |> preload([:comments])
    |> Repo.all()
    


    결과:


    uma 쿼리 usando SQL과 유사한 결과:


    관찰자 폰토스:
  • Como o post de id 1 tinha dois comentários, ele apareceu duplicado, 유사한 Consulta com SQL.
  • Apareceram apenas os posts que possuem comentários.

  • Podemos corrigir a duplicação usando o distinct:

    Repo.all(
          from p in Post,
            distinct: true,
            join: c in assoc(p, :comments),
            preload: [comments: c]
        )
    




    Post
    |> distinct(true)
    |> join(:inner, [p], c in assoc(p, :comments))
    |> preload([:comments])
    |> Repo.all()
    


    결과:



    Agora temos apenas os posts que possuem commentários.

    Selecionando os campos는 사전 로드를 수행합니다.



    Para melhorar o nosso desempenho, ao invés de trazer todos os campos do comentário, podemos selecionar os campos que queremos:

    comments_query =
          Comment
          |> select([c], c.body)
    
        Post
        |> distinct(true)
        |> join(:inner, [p], c in assoc(p, :comments))
        |> preload(comments: ^comments_query)
        |> Repo.all()
    


    결과:



    결론



    O preload sem join buscará todas as postagens do banco de dados e, em seguida, fará uma Consulta separada retornando todos os comentários associados às postagens fornecidas. Já usando preload com join em vez de emitir uma Consulta separada para buscar comentários, o Ecto buscará postagens e comentários em uma única Consulta e, em seguida, fará uma passagem separada associando cada comentário à postagem pai.

    좋은 웹페이지 즐겨찾기