[SQL] 어떻게 포스트 그레스에서 CSV 파일의 값으로 선택된 행을 업데이트?
SQL어떻게 포스트 그레스에서 CSV 파일의 값으로 선택된 행을 업데이트?
내가 포스트 그레스를 사용하고 있는데 CSV 파일에서 선택할 것이다 큰 업데이트 쿼리를하고 싶습니다, 내가 가지고 테이블 (ID, 바나나, 사과)을 가지고 말할 수 있습니다.
나는 바나나가 아니라 사과를 변경하는 업데이트를 실행하고 싶습니다, 각각의 새로운 바나나 자신의 ID는 CSV 파일에있을 것입니다.
나는 포스트 그레스 사이트에서 찾고 시도하지만 예는 나를 죽이고있다.
해결법
-
==============================
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.당신은 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()
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
'SQL' 카테고리의 다른 글
[SQL] 값이 숫자는 MySQL의에있는 경우 감지 (0) | 2020.03.23 |
---|---|
[SQL] MySQL의 - 조건부 외래 키 제약 조건 (0) | 2020.03.23 |
[SQL] 테이블 변수에 인덱스를 생성 (0) | 2020.03.23 |
[SQL] 페이징을 구현하는 효율적인 방법 (0) | 2020.03.23 |
[SQL] SQL에 LINQ - 왼쪽 외부 복수로 가입 조건 가입 (0) | 2020.03.23 |