Note that there are some explanatory texts on larger screens.

plurals
  1. PODjango Oracle integrity error when saving any instance to database
    primarykey
    data
    text
    <p>I'm doing a migration from sqlite to oracle backend. The oracle database already exists and is maintained by other people. Its version is Oracle9i Enterprise Edition Release 9.2.0.1.0.</p> <p>I have a simple model:</p> <pre><code>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" </code></pre> <p><code>./manage.py syncdb</code> does not return any errors. But when I try to create a new instance and save it to the database, I get the following error:</p> <pre><code>&gt;&gt;&gt; AliasType.objects.create(name="test") Traceback (most recent call last): File "&lt;console&gt;", line 1, in &lt;module&gt; 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") </code></pre> <p>If I specify id, e.g. <code>AliasType.objects.create(id=5, name="test")</code>, it works. I thought django should be able to retrieve id value automatically. I've learnt that Oracle does not support autoincrement, and I should use triggers and sequences. I was told that there is an existing sequence in the database that returns ids for all new rows, and I know its name, say <code>SEQ_GET_NEW_ID</code>. </p> <p>So the question is how to implement that in the most elegant way, i.e. how to tell Django to <code>get id values for all new objects from the sequence named SEQ_GET_NEW_ID</code> without hacking it too much (e.g. overriding save() methods for all models)?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload