3

我正在将一个 Django 项目从 SQLite 迁移到 Oracle,并且在 disn_requisition.save() 行上抛出一个错误,声称它的 ID 为空。我没有尝试在任何模型上手动设置或摆弄 id 字段,尽管我确实阅读了它们。

关于我需要做些什么来解决这个问题的任何见解?

IntegrityError at /upload/storage

ORA-01400: cannot insert NULL into ("INVDB"."INVDB_DISK_REQUISITION"."ID")
Request Method: POST
Request URL: [url here]
Django Version: 1.2.3
Exception Type: IntegrityError
Exception Value: 
ORA-01400: cannot insert NULL into ("INVDB"."INVDB_DISK_REQUISITION"."ID")
Exception Location: /tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/django/db/backends/oracle/base.py in execute, line 507
Python Executable: /tools/python/2.7/Linux_x86_64/bin/python
Python Version: 2.7.0
Python Path: ['/home/jhayward/invdb', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/django_filter-0.5.3-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/ez_setup-0.9-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/distribute-0.6.14-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/hgsvn-0.1.8-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/paramiko-1.7.6-py2.7.egg', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/pycrypto-2.3-py2.7-linux-x86_64.egg', '/tools/python/cx_Oracle/10g/2.6/Linux_x86_64/lib/python2.6/site-packages', '/home/jhayward', '/home/jhayward/invdb/HOME_DIRECTORY', '/home/jhayward/invdb/HOME_DIRECTORY/invdb', '/tools/python/2.7/Linux_x86_64/lib/python27.zip', '/tools/python/2.7/Linux_x86_64/lib/python2.7', '/tools/python/2.7/Linux_x86_64/lib/python2.7/plat-linux2', '/tools/python/2.7/Linux_x86_64/lib/python2.7/lib-tk', '/tools/python/2.7/Linux_x86_64/lib/python2.7/lib-old', '/tools/python/2.7/Linux_x86_64/lib/python2.7/lib-dynload', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages', '/tools/python/2.7/Linux_x86_64/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info']
Server time: Thu, 30 Dec 2010 10:04:24 -0600
4

1 回答 1

3

我将此问题发布到 django-users@googlegroups.com 并得到以下答案:

“问题在于 SQLite 和 Oracle 的区别。与 MySQL、PostgresQL 和 SQLIte 不同,Oracle 没有自动生成的主键。为了弥补这一点,Oracle 上的 Django 对每个 Django 管理的表使用触发器在插入时识别 NULL 主键,并通过使用该表的专用序列生成一个键。通常,如果您从头开始创建表,Django 管理工具(syncdb、sqlall 等)将创建序列并触发在不知道如何填充架构的情况下,很难说出了什么问题,但是如果您运行“python manage.py sqlall invdb”,它应该打印出 DDL 以创建触发器和序列,并且您可以手动添加他们。”

在我的情况下 - 错误可能是与此相关的二次损坏 - “python manage.py syncdb”第一次崩溃,作为标准解决方法我第二次运行它,当它运行时没有报告错误。我把它交给了另一个人,所以我不确定它是如何解决的,但我相信丢失的触发器可能是与崩溃相关的二次损坏,我想这是通过使用数据库类型放置代码来解决的有问题的模型有触发器。

于 2011-02-07T13:32:16.453 回答