Elixir Today: Ecto를 사용하여 PostgreSQL에서 중복 행 제거

소개



이 튜토리얼에서는 Ecto를 사용하여 스키마에서 중복 행을 제거하는 방법을 공유하고자 합니다.

준비


  • 스키마 마이그레이션에서 이 스키마 설정이 있다고 가정합니다.

  • CREATE TABLE(:student_teacher, primary_key: false) do
    
         add :id, :uuid, primary_key: true
         add :student_id, references(:students, type: :uuid)
         add :teacher_id, references(:teachers, type: :uuid)
    
    end
    


  • 그런 다음 두 개의 중복 레코드를 삽입해 보겠습니다. (데이터 목업에 Ex.Machina을 사용한다고 가정)

  • student = insert(:student)
    teacher = insert(:teacher)
    insert_list(100, :student_teacher, student: student, teacher: teacher)
    


    IEx를 사용하여 중복 행 확인



    콘솔에서 iex -S mix를 실행하고 중복 행이 있는지 확인하십시오.

    iex) query = SELECT COUNT(*), student_id, teacher_id FROM 
    student_teacher group by student_id, teacher_id having count(*) > 1;
    
    iex) Ecto.Adapter.SQL.query!(Repo, query)
    
    iex) %Postgrex.Result{
      columns: ["count", "student_id", "teacher_id"],
      command: :select
      num_rows: 1,
      rows: [
        [
          100,
          <<student_id>>,
          <<teacher_id>>
        ],
    
      ]
    }
    
    


    쿼리를 실행하여 중복 행 삭제




    Repo.transaction(
          fn ->
            query = """
            DELETE FROM student_teacher s1
            USING student_teacher s2
            where s1.id < s2.id
            AND s1.student_id = s2.student_id
            AND s1.teacher_id = s2.teacher_id
            """
    
            Ecto.Adapters.SQL.query!(Repo, query)
          end,
          timeout: :infinity
        )
    
    


    Happy Coding!

    좋은 웹페이지 즐겨찾기