홈>
postgresql 데이터베이스에서 :
class Persons(models.Model):
person_name = models.CharField(max_length=10, unique=True)
persons.csv
파일에 백만 개의 이름이 포함되어 있습니다.
$cat persons.csv
Name-1
Name-2
...
Name-1000000
다음을 원합니다 :
<올>내 접근 방식 :
<올>
COPY
사용
명령 또는 django-postgres-copy 그것을 구현하는 응용 프로그램.
또한 새로운 Postgresql-9.5 + 업데이트 기능 .
이제 csv 파일의 모든 이름도 데이터베이스에 있습니다.
데이터베이스에서 효율적인 방법으로 다른 CSV 파일로 ID를 가져와야합니다.
Q
사용 개체list_of_million_q = <iterate csv and append Qs> million_names = Names.objects.filter(list_of_million_q)
또는
__in
이름 목록을 기준으로 필터링 :list_of_million_names = <iterate csv and append strings> million_names = Names.objects.filter( person_name__in=[list_of_million_names] )
또는
?
ID를 가져 오는 위의 방법 중 어느 것이 효율적이라고 생각하지 않습니다.
업데이트세 번째 옵션은 이 게시물 을 따라 위의 모든 것을 결합한 훌륭한 솔루션이어야합니다. .
- 답변 # 1
- 답변 # 2
이 게시물은
나는 sqlfiddle에서 그것을 테스트했는데RETURNING
사용법에 대해 설명합니다ON CONFLICT
와 함께 따라서 데이터베이스에 csv 파일의 내용을 삽입하는 동안 삽입이 성공하거나 고유 제한 조건으로 인해 삽입이 생략되면 id가 다른 테이블에 저장됩니다.COPY
에 사용 된 것과 유사한 설정을 사용했습니다. 고유 제한 조건을 고려하여 csv 파일에서 직접 데이터베이스에 삽입하는 명령입니다.스키마 :
CREATE TABLE IF NOT EXISTS label ( id serial PRIMARY KEY, label_name varchar(200) NOT NULL UNIQUE ); INSERT INTO label (label_name) VALUES ('Name-1'), ('Name-2'); CREATE TABLE IF NOT EXISTS ids ( id serial PRIMARY KEY, label_ids varchar(12) NOT NULL );
스크립트 :
CREATE TEMP TABLE tmp_table (LIKE label INCLUDING DEFAULTS) ON COMMIT DROP; INSERT INTO tmp_table (label_name) VALUES ('Name-2'), ('Name-3'); WITH ins AS( INSERT INTO label SELECT * FROM tmp_table ON CONFLICT (label_name) DO NOTHING RETURNING id ) INSERT INTO ids (label_ids) SELECT id FROM ins UNION ALL SELECT l.id FROM tmp_table JOIN label l USING(label_name);
출력 :
SELECT * FROM ids; SELECT * FROM label;
관련 자료
- python - PostgreSQL 고유 인덱스 성능
- python 3.x - 매우 큰 ndarray를 반복하면서 postgresql 데이터베이스에 레코드를 삽입하는 더 빠른 방법이 있습니까?
- clojure - ON CONFLICT DO UPDATE를 사용하여 HugSQL을 사용하여 PostgreSQL 테이블에 여러 행을 한 번에 삽입
- sql - postgresql - 2 개의 열 조합에 대한 고유 제한
- postgresql - upsert - insert… on conflict가 함수 기반 인덱스를 'lower ()'고유 제한 조건으로 사용하여 실패
- python - 테이블에 고유 값을 삽입하고 해당 값을 가져 와서 단일 'for'루프 아래 다른 테이블에서 참조 할 수 있습니까?
- python - BeautifulSoup 삽입 데이터가있는 PostgreSQL
- aggregate functions - PostgreSQL 어레이 고유 집계
- sql - PostgreSQL 데이터베이스 테이블에 소수점이있는 숫자를 삽입하는 방법은 무엇입니까?
- Python을 사용한 PostgreSQL INSERT
- sql server - 루핑없이 UNIQUE 값의 모든 조합을 삽입
- sql - 동일한 외래 키를 가진 모든 행이 내 PostgreSQL 데이터베이스에서 고유 한 이름을 가지도록하려면 어떻게해야합니까?
- python - tsv 파일에서 배열의 각 요소를 개별적으로 PostgreSQL에 삽입하는 방법은 무엇입니까?
- sql - PostgreSQL, 열에서 값을 삽입
- sql - JSON 배열 객체를 별도의 요소로 PostgreSQL에 삽입하는 방법
- sql - PostgreSQL의 2 개 열에서 고유 한 값을 가져 오는 방법
- php - mysql 테이블에 고유 한 이메일을 삽입하는 방법
- 관련 테이블/뷰의 값을 적용하는 PostgreSQL 뷰 INSERT 규칙
- sql - 여러 관련 테이블의 열에 대한 Postgresql 고유 제약 조건
- python - 데이터 프레임/CSV에서 PostgreSQL 데이터베이스로 대량 데이터 삽입 또는 업데이트
관련 질문
- python : 장고 쿼리 셋 필터 파일 필드가 비어 있지 않습니다.
- python : eb cli (django postgres)를 통해 AWS RDS 데이터베이스를 마이그레이션하려면 어떻게해야합니까?
- python : Django-makemigrations-감지 된 변경 사항 없음
- python : django-"DateField"에 yy-mm 만 입력하는 방법
- python : Django 표시 : OSError : [WinError 123] 파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 잘못되었습니다. '
' - python : 목록을 dict 및 시간 관련 값과 어떻게 일치 시키나요?
- python : "detail": "Method \"GET \ "이 허용되지 않습니다. django에서 엔드 포인트를 호출 할 때
- python : 동일한 네트워크 (comose에서)의 도커 컨테이너가 서로를 보지 못함
- python : Django에서 대소 문자를 구분하지 않는 사용자 이름을 만드는 동안 일치하는 쿼리 오류
- python : 수퍼 유저를 제외한 다른 계정으로 django 앱에 로그인 할 수 없습니다.
같은 것 :
이름 만들기 : 데이터베이스에서받은 이름 중 id 사전 :
사전 쿼리 :
이 방법으로 느린
그러나 실제로 확실하게 알 수있는 유일한 방법은이 3 가지 접근법을 벤치마킹하는 것입니다.if x in list
와 달리 빠른 사전 인덱싱을 사용합니다. 접근.