2013-03-07 3 views
3

데이터베이스의 고유성을 보장하면서 대용량 레코드를 신속하게 대량으로 삽입 할 수 있어야합니다. 삽입 할 새 레코드는 이미 구문 분석되었으며 고유합니다. 나는 코드 자체가 아니라 데이터베이스 레벨에서 고유성을 강화할 수있는 방법이 있기를 바라고있다.Django 고유 벌크 삽입물

데이터베이스 백엔드로 MySQL을 사용하고 있습니다. 장고가 다른 데이터베이스에서이 기능을 지원한다면 백엔드를 변경하는 데 유연합니다.

Django의 벌크 삽입물은 save 메서드를 사용하지 않으므로 고유 필드와 고유 필드를 존중하면서 동시에 수 백에서 수천 개의 레코드를 삽입 할 수 있습니까?


내 모델 구조는 단순화, 다음과 같이 보일 :

class Example(models.Model): 
    Meta: 
     unique_together = (('name', 'number'),) 

    name = models.CharField(max_length = 50) 
    number = models.CharField(max_length = 10) 
    ... 
    fk = models.ForeignKey(OtherModel) 

편집 :

이미 데이터베이스에없는 레코드가 삽입되어야 레코드를 이미 존재했던 것은 무시되어야한다.

+0

원본 데이터는 어떤 형식입니까? 그것은 csv 경우, 난 그냥 각 항목을 통해 반복하고 그런 식으로 저장할 수 있는지 궁금하네요. – djq

+0

['get_or_create'] (https://docs.djangoproject.com/ko/1.6/ref/models/querysets/#get-or-create). –

답변

0

장고 자체는 unique_together 메타 속성을 적용하지 않습니다. 이것은 UNIQUE 절을 사용하는 데이터베이스에 의해 시행됩니다. 원하는만큼의 데이터를 삽입 할 수 있으며 지정된 필드가 고유하게 보장됩니다. 그렇지 않은 경우 예외가 발생합니다 (어느 것이 확실하지 않은 경우). docsunique_together에 대해 자세히 알아보십시오.

1

miki725의 언급대로 현재 코드에 문제가 없습니다. bulk_create 메소드를 사용 중이라고 가정합니다. bulk_create를 사용할 때 save() 메서드가 호출되지 않지만 save() 메서드 내에서 필드의 고유성이 적용되지 않는 것은 사실입니다.

장고 :

unique_together = (('name', 'number'),) 

MySQL은 : 당신이 값을 삽입한다면

UNIQUE KEY `name` (`name`,`number`) 

당신이 고유 제한 조건 unique_together 사용하면 테이블을 만들 때는 MySQL의에서 기본 테이블에 추가 어떤 방법 (save, bulk_insert 또는 raw SQL)을 사용하여 테이블에 추가하면 mysql에서이 예외가 발생합니다.

,183,210

UPDATE : 무엇 bulk_insert

그것은 하나 개의 쿼리로 한 번에 모든 데이터를 삽입 하나 개의 큰 쿼리를 생성하는 것입니다. 따라서 항목 중 하나가 중복되면 예외가 발생하고 데이터가 삽입되지 않습니다.

1- 하나의 옵션은 bulk_insert의 batch_size 매개 변수를 사용하여 여러 배치에 데이터를 삽입하여 하나가 실패하면 해당 배치의 나머지 데이터 만 누락되도록하는 것입니다. (모든 데이터를 삽입하는 것이 얼마나 중요하고 중복 항목이 얼마나 빈번한가에 달려 있습니다)

2 또 다른 옵션은 대량 데이터에 대해 for 루프를 작성하고 대량 데이터를 하나씩 삽입하는 것입니다.이렇게하면 한 행만 예외가 발생하고 나머지 데이터는 삽입됩니다. 이것은 매번 db를 쿼리 할 것이고 물론 더 느리게 진행됩니다.

세 번째 옵션은 고유 제한 조건을 해제하고 bulk_create를 사용하여 데이터를 삽입 한 다음 중복 행을 삭제하는 간단한 쿼리를 작성하는 것입니다.

+0

여전히 나머지 레코드가 삽입됩니까? – NickCSE

+0

@NickCSE plz 답변 업데이트 – jurgenreza

+0

불행히도, 나는 어떤 데이터도 놓칠 수 없으며, 각 레코드는 데이터베이스에 있어야합니다. 저는 현재 # 2와 같은 것을하고 있는데,이 질문을하기에 충분히 느립니다. 나는 # 3을 생각해 보았지만, 그것이 확장 성이 전혀없는 것처럼 보였다. 각 대량 삽입물은 수천 개의 레코드 중 10 개가 될 수 있습니다. – NickCSE