2011-09-20 2 views
5

저는 PHP 응용 프로그램의 MySQL 데이터베이스를 새로운 Django 프로젝트에 통합하고 있습니다. Inspectdb이 제대로 작동 했으므로 몇 가지 필드를 ForeignKeys로 변경해야했습니다. 현재 모든 읽기 및 편집 현재 데이터가 훌륭하게 작동하고 있습니다.Django - 레거시 db 및 'id'필드의 문제

문제는 새로운 항목을 만들려고 할 때 오류가 발생합니다. "Field 'id' doesn't have a default value"입니다. 추적은 form.save() 호출에서 시작하며 예외는 MySQL 커서에서 발생합니다. 대부분의 경우 열이 id라는 있지만, 하나의 케이스에 명명 된 값입니다

ModelTwo를 들어
class ModelOne(models.Model): #normal "id" named pk 
    id = models.AutoField(primary_key=True, db_column='id', default=None) 
    other_fields = ... 

class ModelTwo(models.Model): #specific pk 
    named_pk = models.AutoField(primary_key=True, db_column='named_pk', 
           default=None) 
    other_fields = ... 

, 내가 올바른 양식을 게시 할 때, 나는 오류,하지만 내 데이터 목록으로 돌아 가면 , 새 항목이 나타납니다! 그리고 셸에서 최신 id 값을 확인한 후에 올바르게 증가하고 있음을 알 수 있습니다.

그러나 ModelOne (단지 id)의 경우 오류가 계속 나타나며 pk가 2147483647 (최대)가되고 중복 ID로 인해 이후 저장에 실패합니다. (다음으로 높은 pk는 62158입니다.)

이 ID 필드가 올바르게 작동하려면 무엇을해야합니까?


업데이트 : 아직 행운을 고치지 않았습니다. 데이터를 덤핑하고 새로운 장고 내장 테이블로 가져 오는 것에 대해 생각해보십시오. 이 문제에 대한 해결책을 찾고 있습니다.


갱신 2 : DB 쉘에서 정보

ModelOne :

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 

ModelTwo :

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| named_pk | int(11)  | NO | PRI | NULL | auto_increment | 
+0

을 = 없음 '? –

+0

@Daniel Roseman - 똑같은 것. 오류를 나타내는 것처럼 보였던 것을 직접 처리하기 위해 추가했습니다. –

답변

1

에 대한 ModelTwo에 대한 데이터베이스에서 모델 및 기본 NULL에서, 그리고 신선한 DB에로드하는 내 모델/프로젝트에서 생성되었습니다.

필자가 작업했던 원본 데이터베이스의 복사본을 너무 많이 사용하여 pk 필드의 기본 SQL을 손상 시켰다고 생각합니다.

나는 단지 사본으로 만 작업했기 때문에 기쁩니다.

+0

같은 일이 저에게 일어났습니다. 똑같은 문제가있었습니다. 데이터 내보내기, 테이블 재 작성을 통해 django는 mysql 자동 증가 특성을 설정하여 새로운 pk 생성을 mysql에 적절하게 위임 할 수있었습니다. – hobs

3

당신이 이미하고있는대로 (ModelTwo에 대한 PK를 정의하는 것이 합리적이다) 당신의 pk가 다른 이름 'named_pk'를 갖고 있기 때문입니다. 그러나 ModelOne의 pk로 'id'를 명시 적으로 정의 할 필요가 없습니다. Django는 기본적으로 id 컬럼을 생성합니다. 따라서 ModelOne에 id 열을 전혀 정의하지 마십시오.

UPDATE : 제거 "기본 = 없음"나는 원래 데이터베이스에서 데이터를 내보내는 결국 named_pk

+0

나는이 접근 방식을 시도했습니다. SQL에 들어가서 가능한 구조를 살펴보면 이미 'id'열이 auto_increment로 설정되어 있습니다. 문제는 그것을 인식 장고에 놓여 있다고 생각합니다. 실제로 데이터를 올바르게 저장 했음에도 불구하고 ModelTwo에 오류가 발생하는 이유는 무엇입니까? –

+0

'SHOW COLUMNS FROM table_name'의 MySQL 출력을 보여주기 위해 제 질문을 업데이트했습니다. 나는 당신이 말하는 것을 따르지 않는다. ModelTwo에는 'id'라는 이름의 열이 없다. 'named_pk'필드는 항상 PK 열이었습니다. 이 모델의 경우 'named_pk'의 실제 값은 매우 중요합니다 (구매 시스템의 순차 주문 번호와 관련이 있음). –

+0

ModelTwo 테이블에 'id'열이 없으면 ModelTwo를 저장할 때 발생하는 오류는 무엇입니까? –

5

일부 복잡한 South 마이그레이션 후에 같은 문제가 발생했습니다. 데이터베이스를 다시로드하지 않으려면 (덤프/가져 오기) 운 좋게도 동일한 문제를 검색 한 후이 게시물에 속한 다른 사람들을 도울 것입니다.

데이터베이스를 내보내고 가져올 필요없이이 문제를 해결하는 솔루션을 발견했습니다.라는 테이블 AUTH_USER를 들어

, 위의 오류 메시지 관념 것이다 다음 MySQL의 명령에서

ALTER TABLE auth_user MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT; 

원래 솔루션 : 당신은`기본을 제거하면 어떻게됩니까

http://webit.ca/2012/01/field-id-doesnt-have-a-default-value/

+0

+1 나를 위해 일했습니다. –

관련 문제