2010-12-30 3 views
3

Django 프로젝트를 SQLite에서 Oracle로 마이그레이션하려고하는데 disn_requisition.save()에 null ID가 있다고 주장하는 오류가 발생합니다. 어떤 모델에서든 id 필드를 수동으로 설정하거나 바이올린을 시도하지는 않았지만 읽었습니다.Django에서 null ID로 인스턴스를 저장하려고 시도한 Oracle 로의 마이그레이션이 왜 발생합니까?

이 문제를 해결하기 위해 내가해야 할 일에 대한 통찰력이 있습니까?

IntegrityError at /upload/storage 

ORA-01400: cannot insert NULL into ("INVDB"."INVDB_DISK_REQUISITION"."ID") 
Request Method: POST 
Request URL: [url here] 
Django Version: 1.2.3 
Exception Type: IntegrityError 
Exception Value: 
ORA-01400: cannot insert NULL into ("INVDB"."INVDB_DISK_REQUISITION"."ID") 
Exception Location: /tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/django/db/backends/oracle/base.py in execute, line 507 
Python Executable: /tools/python/2.7/Linux_x86_64/bin/python 
Python Version: 2.7.0 
Python Path: ['/home/jhayward/invdb', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/django_filter-0.5.3-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/ez_setup-0.9-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/hgsvn-0.1.8-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/paramiko-1.7.6-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/pycrypto-2.3-py2.7-linux-x86_64.egg', '/tools/python/cx_Oracle/10g/2.6/Linux_x86_64/lib/python2.6/site-packages', '/home/jhayward', '/home/jhayward/invdb/HOME_DIRECTORY', '/home/jhayward/invdb/HOME_DIRECTORY/invdb', '/tools/python/2.7/Linux_x86_64/lib/python27.zip', '/tools/python/2.7/Linux_x86_64/lib/python2.7', '/tools/python/2.7/Linux_x86_64/lib/python2.7/plat-linux2', '/tools/python/2.7/Linux_x86_64/lib/python2.7/lib-tk', '/tools/python/2.7/Linux_x86_64/lib/python2.7/lib-old', '/tools/python/2.7/Linux_x86_64/lib/python2.7/lib-dynload', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info'] 
Server time: Thu, 30 Dec 2010 10:04:24 -0600 
+0

명확히하기 위해 포함시킨 오류는 새로운 모델을 만들고 저장하는 것입니다. 아마도 모델 정의도 게시하고 싶습니까? –

+0

모델의 새로운 인스턴스를 저장하려고 할 때 발생합니다. – JonathanHayward

+0

이 프로젝트는 PostgreSQL에서도 SQLite로 작동합니다. – JonathanHayward

답변

3

나는 [email protected]이 질문을 게시 다음과 같은 대답을 얻었다 :

"문제는 SQLite는 오라클의 차이에 MySQL은, PostgreSQL을, 그리고 SQLite는 오라클과는 달리. 자동 생성 된 기본 키가 없습니다. 오라클의 Django는 삽입시 NULL 기본 키를 인식하는 Django 관리 테이블마다 트리거를 사용하고 해당 테이블의 전용 시퀀스를 사용하여 키를 생성합니다. 보통 처음부터 테이블을 생성하는 경우 장고 관리 도구 (syncdb, sqlall 등)를 사용하면 시퀀스가 ​​만들어지고 트리거됩니다. 스키마가 어떻게 채워지는지 더 알지 못하면 무엇이 잘못되었는지를 말하기 어렵지만 나는 f를 실행하면 'python manage.py sqlall invdb'가 DDL을 출력하여 트리거와 시퀀스를 만들고 수동으로 추가 할 수 있습니다. "

필자의 경우 -이 오류와 관련된 2 차적 손상이있을 수 있습니다 - "python manage.py syncdb"가 처음으로 충돌했고 표준 해결 방법으로 두 번째로 실행했습니다. 오류를보고했습니다. 나는 이것을 다른 사람에게 넘겨서 어떻게 해결되었는지 확신 할 수 없지만, 누락 된 방아쇠가 충돌과 관련된 2 차 피해일지도 모른다고 믿습니다. 그리고 데이터베이스 유형이 코드를 그 자리에 놓음으로써 해결되었다고 생각합니다. 그 기분을 상하게하는 모델이 방아쇠를 당겼다.

+0

처음으로 syncdb 실패에 대한 언급을 +1했습니다. 그것이 나를 위해 무엇을 했는가. 감사! – Shawn

+0

참고 : 이것은 나를 위해 '의사가 작동했습니다'. 두 번 시도하는 것이 명백한 실패없이 실행되었지만 장고가 지원되는 다른 모든 데이터베이스에서 자동 증가 기본 키가 무엇인지에 대한 오류가있었습니다. 오라클에는 기본적으로 포함되어 있지 않으므로 장고는 자동 증가 기본 키를 에뮬레이트하는 사후 트리거를 추가하여 보완합니다 . 누락 된 기능에 대한 이러한 보상은 Oracular 비 호환성의 희생자였으며 작동하지 않았습니다. 두 번 실행하여 작동 시키면, 테스트 할 때까지는 신중할 것입니다. – JonathanHayward

+0

나는 syncdb의 실패를 깨달았을 때 (필자의 경우) 시퀀스를 수정해야한다는 것을 분명히하지 않았다. (null id 에러가 아닌 행을 삽입 한 후에 중복 된 id 에러가 발생했다.) 방아쇠가 잘 작동했지만 시퀀스에 잘못된 next_val이있었습니다. 필자가 수동으로 수정하면 모든 것이 설계된대로 작동하기 시작했습니다. syncdb 실패에 대한 언급이 아니라면 근본적인 원인을 발견하지 못했을 것입니다. 근본적인 원인이 실제로 무엇인지 다른 사람들에게 명확히 해 주셔서 감사합니다. – Shawn