2011-02-07 2 views
2

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

오류를 반환하지 않습니다

나는 간단한 모델을 가지고있다. 내가, 예를 들어, ID를 지정하는 경우

>>> 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() 메소드를 재정의하지 않고) 어떻게 구현하는지 궁금합니다.

답변

1

정확히 허용되도록 티켓을 여는 (#1946) 기본 시퀀스 이름을 무시합니다. 그러나 아직 폐쇄되지 않았기 때문에 해킹이없는 방법이 없다고 생각합니다.

이전에 Oracle을 사용하지 않았지만 빠른 검색을 통해 시퀀스의 별칭/동의어를 만들 수 있음을 알 수 있습니다. manage.py sqlall <app>은 Django가 예상하는 시퀀스 이름을 보여 주어야합니다. 그래서 이것을 SEQ_GET_NEW_ID의 별명으로 만들 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그것은 내 해결 방법을 찾는데 도움이되었습니다. 데이터베이스를 관리하는 사람에게 모든 테이블에 대한 트리거를 만들도록 요청했습니다. 트리거는 같은 시퀀스 'SEQ_GET_NEW_ID'에서 삽입되기 전에 다음 ID를 얻습니다. 따라서 순서에 대한 별명은 여기에 필요하지 않습니다. –

+2

방금 ​​삽입 한 행의 ID를 장고가 가져 오는 방법에 대해 명확하게 설명합니다. 'use_returning_into' 옵션을 지정하면 django는'INSERT' 절에서 직접 id를 가져옵니다. 이 경우 django에서는 시퀀스가 ​​필요하지 않습니다. 'use_returning_into'가 false이면, django는 먼저 시퀀스에서'APP_MODEL_SQ'라는 이름을 가진 새로운 id를 얻은 다음 그 id를 가진 행을 삽입합니다. 이 경우 django가 사용할 수 있도록 기존 시퀀스의 별칭을 만들어야합니다 (전체 데이터베이스에 대해 동일한 시퀀스가 ​​될 수 있음). –