sqlite에서 oracle 백엔드로 마이그레이션하고 있습니다. 오라클 데이터베이스는 이미 존재하며 다른 사람들이 관리합니다. 버전은 Oracle9i Enterprise Edition 릴리스 9.2.0.1.0입니다. Django 데이터베이스에 인스턴스를 저장할 때 Oracle 무결성 오류가 발생합니다.
class AliasType(models.Model):
id = models.AutoField(primary_key=True, db_column="F_ALIAS_ID")
name = models.CharField(u"Type name", max_length=255, unique=True, db_column="F_ALIAS_NAME")
class Meta:
db_table = "ALIAS"
./manage.py syncdb
>>> AliasType.objects.create(name="test")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/models/manager.py", line 138, in create
return self.get_query_set().create(**kwargs)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/models/query.py", line 360, in create
obj.save(force_insert=True, using=self.db)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/models/base.py", line 460, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/models/base.py", line 553, in save_base
result = manager._insert(values, return_id=update_pk, using=using)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/models/manager.py", line 195, in _insert
return insert_query(self.model, values, **kwargs)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/models/query.py", line 1435, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/models/sql/compiler.py", line 791, in execute_sql
cursor = super(SQLInsertCompiler, self).execute_sql(None)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/models/sql/compiler.py", line 735, in execute_sql
cursor.execute(sql, params)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/backends/util.py", line 18, in execute
return self.cursor.execute(sql, params)
File "/mnt/Data/private/projects/envs/termary-oracle/src/django/django/db/backends/oracle/base.py", line 630, in execute
return self.cursor.execute(query, self._param_generator(params))
IntegrityError: ORA-01400: cannot insert NULL into ("SINCE"."ALIAS"."F_ALIAS_ID")
: 나는 새로운 인스턴스를 생성하고 데이터베이스에 저장하려고 할 때, 나는 다음과 같은 오류가 발생합니다 AliasType.objects.create(id=5, name="test")
, 작동합니다. 나는 장고가 id 값을 자동으로 검색 할 수 있어야한다고 생각했다. 오라클은 자동 증가를 지원하지 않으며 트리거와 시퀀스를 사용해야한다고 배웠습니다. 모든 새로운 행에 대해 ID를 반환하는 데이터베이스의 기존 시퀀스가 있으며 그 이름을 알고 있다고 말했습니다 (예 : SEQ_GET_NEW_ID
).
가장 좋은 방법, 즉 Django를 get id values for all new objects from the sequence named SEQ_GET_NEW_ID
에 해킹하지 않고 (예 : 모든 모델에 대해 save() 메소드를 재정의하지 않고) 어떻게 구현하는지 궁금합니다.
답장을 보내 주셔서 감사합니다. 그것은 내 해결 방법을 찾는데 도움이되었습니다. 데이터베이스를 관리하는 사람에게 모든 테이블에 대한 트리거를 만들도록 요청했습니다. 트리거는 같은 시퀀스 'SEQ_GET_NEW_ID'에서 삽입되기 전에 다음 ID를 얻습니다. 따라서 순서에 대한 별명은 여기에 필요하지 않습니다. –
방금 삽입 한 행의 ID를 장고가 가져 오는 방법에 대해 명확하게 설명합니다. 'use_returning_into' 옵션을 지정하면 django는'INSERT' 절에서 직접 id를 가져옵니다. 이 경우 django에서는 시퀀스가 필요하지 않습니다. 'use_returning_into'가 false이면, django는 먼저 시퀀스에서'APP_MODEL_SQ'라는 이름을 가진 새로운 id를 얻은 다음 그 id를 가진 행을 삽입합니다. 이 경우 django가 사용할 수 있도록 기존 시퀀스의 별칭을 만들어야합니다 (전체 데이터베이스에 대해 동일한 시퀀스가 될 수 있음). –