简体   繁体   English

在Django中,为什么迁移到Oracle导致尝试使用空ID保存实例?

[英]In Django, why is migration to Oracle resulting in attempts to save instances with null ID?

I'm migrating a Django project from SQLite to Oracle, and I'm getting an error thrown on the line disn_requisition.save() claiming that it has a null ID. 我正在将一个Django项目从SQLite迁移到Oracle,并且我在行disn_requisition.save()上抛出一个错误,声称它有一个空ID。 I have not attempted to manually set or fiddle with id fields on any model, although I do read them. 我没有尝试在任何模型上手动设置或摆弄id字段,尽管我确实阅读过它们。

Any insight on what I need to do to address this? 有关解决这个问题需要做些什么的见解?

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

I posted this question to django-users@googlegroups.com and got the following answer: 我将此问题发布到django-users@googlegroups.com并得到以下答案:

"The problem is in the difference in SQLite and Oracle. Unlike MySQL, PostgresQL, and SQLIte, Oracle doesn't have auto-generated primary keys. To make up for that, Django on Oracle uses a trigger for each Django-managed table that recognizes a NULL primary key on insert, and generates a key by using a dedicated sequence for that table. Usually if you're creating the tables from scratch, the Django management tools (syncdb, sqlall, etc) will create the sequence and trigger for you. Without knowing more about how your populated your schema, it's hard to say what went wrong, but if you run 'python manage.py sqlall invdb' it should print out the DDL to create the trigger and sequence, and you can manually add them." “问题在于SQLite和Oracle的区别。与MySQL,PostgresQL和SQLIte不同,Oracle没有自动生成的主键。为了弥补这一点,Oracle上的Django使用每个Django管理的表的触发器,识别插入时的NULL主键,并通过使用该表的专用序列生成键。通常,如果您从头开始创建表,Django管理工具(syncdb,sqlall等)将创建序列和触发器你不知道更多关于如何填充你的架构,很难说出了什么问题,但如果你运行'python manage.py sqlall invdb'它​​应该打印出DDL来创建触发器和序列,你可以手动添加他们。”

In my case--and the error may be secondary damage related to this--"python manage.py syncdb" crashed the first time through, and as the standard workaround I ran it a second time, when it ran without reported error. 在我的情况下 - 错误可能是与此相关的二次损坏 - “python manage.py syncdb”第一次崩溃,并且作为标准的解决方法,我第二次运行它,当它运行时没有报告错误。 I handed this off to another person so I'm not sure how it got resolved, but I believe that the missing trigger may be secondary damage related to the crash, and I imagine this was resolved by having a database type put code in place so the offending model had the trigger. 我把它交给另一个人,所以我不确定它是如何解决的,但我相信丢失的触发器可能是与崩溃相关的二次损坏,我想这是通过让数据库类型放置代码来解决的有问题的模型有触发器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM