복붙노트

[SQL] 어떻게 포스트 그레스에서 CSV 파일의 값으로 선택된 행을 업데이트?

SQL

어떻게 포스트 그레스에서 CSV 파일의 값으로 선택된 행을 업데이트?

내가 포스트 그레스를 사용하고 있는데 CSV 파일에서 선택할 것이다 큰 업데이트 쿼리를하고 싶습니다, 내가 가지고 테이블 (ID, 바나나, 사과)을 가지고 말할 수 있습니다.

나는 바나나가 아니라 사과를 변경하는 업데이트를 실행하고 싶습니다, 각각의 새로운 바나나 자신의 ID는 CSV 파일에있을 것입니다.

나는 포스트 그레스 사이트에서 찾고 시도하지만 예는 나를 죽이고있다.

해결법

  1. ==============================

    1.임시 준비 테이블에 파일을 복사하고 거기에서 실제 테이블을 업데이트합니다. 처럼:

    임시 준비 테이블에 파일을 복사하고 거기에서 실제 테이블을 업데이트합니다. 처럼:

    CREATE TEMP TABLE tmp_x (id int, apple text, banana text); -- but see below
    
    COPY tmp_x FROM '/absolute/path/to/file' (FORMAT csv);
    
    UPDATE tbl
    SET    banana = tmp_x.banana
    FROM   tmp_x
    WHERE  tbl.id = tmp_x.id;
    
    DROP TABLE tmp_x; -- else it is dropped at end of session automatically
    

    가져온 테이블이 정확히 업데이트 할 테이블과 일치하는 경우,이 편리 할 수 ​​있습니다 :

    CREATE TEMP TABLE tmp_x AS SELECT * FROM tbl LIMIT 0;
    

    제약없이 기존 테이블의 구조를 일치 빈 임시 테이블을 작성합니다.

    SQL 복사에 대한 수퍼 유저 권한이 필요합니다. (수동) :

    psql의 메타 명령 \ 어떤 DB 역할에 대한 작품을 복사합니다. 수동 :

    동일한 psql의 세션에서 실행되어야하므로 상기 임시 테이블의 범위는, 하나의 역할을 하나의 세션으로 한정된다 :

    CREATE TEMP TABLE ...;
    \copy tmp_x FROM '/absolute/path/to/file' (FORMAT csv);
    UPDATE ...;
    

    당신이 bash는 명령이 스크립팅하는 경우, 하나의 psql의 호출로 모든 것을 포장해야합니다. 처럼:

    echo 'CREATE TEMP TABLE tmp_x ...; \copy tmp_x FROM ...; UPDATE ...;' | psql
    

    일반적으로, 당신은 psql의 메타 명령과 SQL 명령에 psql의 사이를 전환 할 메타 명령을 \\ 필요하지만, \ 사본은이 규칙의 예외입니다. 수동 다시 :

    가져 오기 테이블이 큰 경우는 세션 (세션에 제일 먼저) 일시적 temp_buffers을 높이기 위해 지불 할 수 있습니다 :

    SET temp_buffers = '500MB';  -- example value
    

    임시 테이블에 인덱스를 추가 :

    CREATE INDEX tmp_x_id_idx ON tmp_x(id);
    

    그리고 임시 테이블이 자동 진공이 적용되지 않기 때문에, 수동으로 ANALYZE 실행 / 자동 분석 할 수 있습니다.

    ANALYZE tmp_x;
    

    관련 답변 :

  2. ==============================

    2.당신은 Python으로 작성된 코드 아래를 시도 할 수 있습니다, 입력 파일은 그 내용이 테이블에 업데이트 할 csv 파일입니다. 각 행은 스플릿 각각의 행에 콤마를 기반으로, 행 [0] 첫번째 열의 값은 행 [1] 번째 열에서 값 등

    당신은 Python으로 작성된 코드 아래를 시도 할 수 있습니다, 입력 파일은 그 내용이 테이블에 업데이트 할 csv 파일입니다. 각 행은 스플릿 각각의 행에 콤마를 기반으로, 행 [0] 첫번째 열의 값은 행 [1] 번째 열에서 값 등

        import csv
        import xlrd
        import os
        import psycopg2
        import django
        from yourapp import settings
        django.setup()
        from yourapp import models
    
    
        try:
           conn = psycopg2.connect("host=localhost dbname=prodmealsdb 
           user=postgres password=blank")
           cur = conn.cursor()
    
           filepath = '/path/to/your/data_to_be_updated.csv'
           ext = os.path.splitext(filepath)[-1].lower()
           if (ext == '.csv'): 
              with open(filepath) as csvfile:
              next(csvfile)
              readCSV = csv.reader(csvfile, delimiter=',')
              for row in readCSV:
                  print(row[3],row[5])
                  cur.execute("UPDATE your_table SET column_to_be_updated = %s where 
                  id = %s", (row[5], row[3]))
                  conn.commit()
              conn.close()
              cur.close()
    
        except (Exception, psycopg2.DatabaseError) as error:
        print(error)
        finally:
        if conn is not None:
          conn.close()
    
  3. from https://stackoverflow.com/questions/8910494/how-to-update-selected-rows-with-values-from-a-csv-file-in-postgres by cc-by-sa and MIT license