2011-02-07 13 views
2

我正在執行從sqlite到oracle後端的遷移。 oracle數據庫已經存在並且由其他人維護。它的版本是Oracle9i企業版版本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"),它的工作原理。我認爲django應該能夠自動檢索id值。我瞭解到Oracle不支持自動增量,我應該使用觸發器和序列。我被告知數據庫中存在一個現有的序列,它返回所有新行的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。因此這裏不需要用於序列的別名。 – 2011-02-07 15:10:50

相關問題