2013-07-21 2 views
2

Postgres 9.1에서 Django 1.3으로 작업하십시오.Django 1.3 - BooleanField에서 DateTimeField 로의 마이그레이션이 실패합니다.

두 개의 오래된 bool 필드 pulledmail_report을 타임 스탬프로 마이그레이션해야했습니다.

마이그레이션을 시도 할 때 데이터베이스에서 null이 아닌 제약 조건을 수동으로 제거하는 방법을 모르면 모든 레코드를 null로 캐스팅 할 수 있습니다. django.db.utils.DatabaseError: column "pulled" cannot be cast to type timestamp with time zone

내 생체 데이터베이스를 수동으로 조작하지 않아도되는 통찰력이 있다면 좋을 것입니다.

모델 선언 변경 :

 # Reporting Checked Flags 
    # pulled => Object has been processed through order_picklist 
- pulled = models.BooleanField(default=False) 
+ pulled = models.DateTimeField(blank=True, null=True, default=None) 
    # mail_report => Object has been processed through report_mailing_list 
- mail_report = models.BooleanField(default=False) 
+ mail_report = models.DateTimeField(blank=True, null=True, default=None) 
+0

두 개의 분리 된 마이그레이션에서이 작업을 수행하는 것이 더 좋을 것이라고 생각합니다. 먼저 두 모델을 모델에서 삭제하고 둘째, 새로운 유형으로 다시 만듭니다. –

+0

@PauloBu 저의 유일한 문제는 기존의 bool 상태를 저장해야한다는 것입니다. 그래서 datetime.now() 스탬프를 현재 true로 플래그가 지정된 모든 것에 추가 할 수 있습니다. – DivinusVox

답변

1

당신은 the Data Migration section in the South's docs을 읽어야합니다. 여기에서 일반 텍스트 암호를 해시 암호로 변경하는 방법을 알려줍니다. 이를 수행하려면 현재 암호의 값을 유지하고 암호를 변환해야합니다.

  • mail_report2이 부울에 따라이 열을 채울 수있는 데이터 마이그레이션을 만들고, pulled2 :

    1. 이름으로 새로운 datetime의 열을 만듭니다

      내 조언은 마이그레이션에 단계적으로이 좋아, 이동하는 것입니다 자신의 respectives 열 pulledmail_report

    2. 을의 값은 부울 열을 삭제하는 또 다른 마이그레이션을 만들기 pulledmail_report
    3. pulled2mail_report2 희망

    pulled에와 mail_report 워드 프로세서에서이 개요 및 the tutorials 도움이 될 이름을 마지막 마이그레이션을 만들기!

  • +0

    이것은 잘 작동 할 것이고, 나는 이것을 필요로 할 때 개념적으로 사용했다. 불행히도 라이브 서버가 가능한 작아 지도록 이러한 트랜잭션을 미리 조정해야하므로 마이그레이션, 소스 변경, 마이그레이션에 시간을 할애 할 수 없습니다. 그래서 원시 쿼리를 사용하여 Django의 쿼리 args 유효성 검사가 ID 목록을 가져오고, 이전 목록을 삭제하고, 새 목록을 생성하고, ID 목록을 반복하여 초기화했습니다. 저를 올바른 방향으로 생각하게 해주셔서 감사드립니다. – DivinusVox

    +0

    음, 어쨌든 만들 수있어서 다행이다 :) –