#24307 closed Bug (fixed)
Oracle Syncdb breaks trying to set NULL to column that already is NULL
Reported by: | JorisBenschop | Owned by: | Shai Berger |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.8alpha1 |
Severity: | Release blocker | Keywords: | oracle 1.8-beta |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | yes | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description
hi
I'm not sure if this is a dev question. Probably I did something dumb, so I hope you can help me discover what that is:
I'm trying to syncdb to an empty Oracle DB. Many tables, triggers and sequences are made but then this:
... Synchronizing apps without migrations: Creating tables... Running deferred SQL... Installing custom SQL... Running migrations: Rendering model states... DONE Applying contenttypes.0002_remove_content_type_name...DEBUG ALTER TABLE "DJANGO_CONTENT_TYPE" MODIFY "NAME" NULL; (params []) DEBUG (0.055) QUERY = u'ALTER TABLE "DJANGO_CONTENT_TYPE" MODIFY "NAME" NULL' - PARAMS = (); args=[] Traceback (most recent call last): ... ... django.db.utils.DatabaseError: ORA-01451: column to be modified to NULL cannot be modified to NULL
Indeed if I run this in oracle directly:
ALTER TABLE "DJANGO_CONTENT_TYPE" MODIFY "NAME" NULL;
I get the same error: you cannot change a NULL column into NULL
I don't understand why django wants to alter a column name of a table it just made a few seconds before, but still. What seems to happen is that it changes a column to NULL, but because it already is NULL, the statement fails.
Workaround is to manually set:
ALTER TABLE "DJANGO_CONTENT_TYPE" MODIFY ("NAME" NOT NULL);
Then run syncdb again and the error is gone.
I can see this is sillyness of oracle, but there's not much I can do about that. Is this a bug?
Change History (7)
comment:1 by , 10 years ago
Keywords: | oracle 1.8-beta added |
---|
comment:2 by , 10 years ago
Its Oracle 11g afaik. I'm not close enough to the DBA to find out easily, but if this is a requirement I can send in an internal request.
comment:3 by , 10 years ago
Owner: | changed from | to
---|---|
Severity: | Normal → Release blocker |
Status: | new → assigned |
Triage Stage: | Unreviewed → Accepted |
It's a bug, I can easily reproduce it by just trying to migrate the default project (created by start_project
, with no changes except for defining an Oracle database).
It happens, as the reporter said, because of Oracle silliness: On Oracle, all CharField
s are defined (in the database) null, because Oracle can't tell the difference between null and an empty string. For Django 1.8, a migration explicitly makes the name
field null (it wasn't null before at the Python level, nor on any other backend), and hence the failure.
comment:5 by , 10 years ago
Needs tests: | set |
---|---|
Patch needs improvement: | set |
The patch fixes the problem reported in the ticket, but it As noted by Tim on IRC, though, to detect such problems ourselves, we should make sure the migrations for contrib apps are all run in the test-suite. Also probably should test for the more specific problem explicitly.
comment:6 by , 10 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Not sure offhand, what version of Oracle (in case it matters)? I'll try to make sure someone investigates this issue before 1.8 beta.