Я делаю миграцию с SQLite на серверную часть Oracle. База данных оракула уже существует и поддерживается другими людьми. Его версия - Oracle9i Enterprise Edition, выпуск 9.2.0.1.0.
У меня есть простая модель:
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")
, это работает. Я думал, что Django должен быть в состоянии получить значение идентификатора автоматически. Я узнал, что Oracle не поддерживает автоинкремент, и я должен использовать триггеры и последовательности. Мне сказали, что в базе данных существует последовательность, которая возвращает идентификаторы для всех новых строк, и я знаю ее имя, скажем, SEQ_GET_NEW_ID
.
Таким образом, вопрос заключается в том, как реализовать это наиболее элегантным способом, то есть, как указать Django на get id values for all new objects from the sequence named SEQ_GET_NEW_ID
, не слишком взламывая его (например, переопределив методы save () для всех моделей)?