#24853: django.db.utils.IntegrityError: null value in column "obj_class_id"
violates not-null constraint
----------------------------------------------+----------------------------
Reporter: rakanalh | Owner: nobody
Type: Uncategorized | Status: new
Component: Database layer (models, ORM) | Version: 1.7
Severity: Normal | Keywords: database,
| migrations
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------------------+----------------------------
Hello,
I am using "django_dynamic_scraper" to scrape data off the internet. I
started my project by creating an empty migration that basically adds a
default scraper.
Models as defined in dynamic_scraper app:
{{{
class ScrapedObjClass(models.Model):
name = models.CharField(max_length=200)
scraper_scheduler_conf = models.TextField(default='\
"MIN_TIME": 15,\n\
"MAX_TIME": 10080,\n\
"INITIAL_NEXT_ACTION_FACTOR": 10,\n\
"ZERO_ACTIONS_FACTOR_CHANGE": 20,\n\
"FACTOR_CHANGE_FACTOR": 1.3,\n')
checker_scheduler_conf = models.TextField(default='\
"MIN_TIME": 1440,\n\
"MAX_TIME": 10080,\n\
"INITIAL_NEXT_ACTION_FACTOR": 1,\n\
"ZERO_ACTIONS_FACTOR_CHANGE": 5,\n\
"FACTOR_CHANGE_FACTOR": 1.3,\n')
comments = models.TextField(blank=True)
def __unicode__(self):
return self.name
class Meta:
ordering = ['name',]
class ScrapedObjAttr(models.Model):
ATTR_TYPE_CHOICES = (
('S', 'STANDARD'),
('T', 'STANDARD (UPDATE)'),
('B', 'BASE'),
('U', 'DETAIL_PAGE_URL'),
('I', 'IMAGE'),
)
name = models.CharField(max_length=200)
obj_class = models.ForeignKey(ScrapedObjClass)
attr_type = models.CharField(max_length=1, choices=ATTR_TYPE_CHOICES)
def __unicode__(self):
return self.name + " (" + self.obj_class.__unicode__() + ")"
}}}
Here's my migration:
{{{
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def add_youtube_scraper(apps, schema_editor):
Scraper = apps.get_model('dynamic_scraper', 'Scraper')
ScrapedObjClass = apps.get_model('dynamic_scraper', 'ScrapedObjClass')
ScrapedObjAttr = apps.get_model('dynamic_scraper', 'ScrapedObjAttr')
ScraperElem = apps.get_model('dynamic_scraper', 'ScraperElem')
scraped_obj_class = ScrapedObjClass()
scraped_obj_class.name = 'Youtube Video'
scraped_obj_class.save()
scraped_attrs_map = {}
scraped_attrs_list = [
{'name': 'base', 'type': 'B'},
{'name': 'url', 'type': 'U'},
{'name': 'title', 'type': 'S'},
{'name': 'body', 'type': 'S'},
{'name': 'images', 'type': 'I'},
{'name': 'videos', 'type': 'S'},
]
for scraped_attr in scraped_attrs_list:
scraped_obj_attr = ScrapedObjAttr()
scraped_obj_attr.name = scraped_attr['name']
scraped_obj_attr.attr_type = scraped_attr['type']
scraped_obj_attr.obj_class_id = scraped_obj_class.id
scraped_obj_attr.save()
scraped_attrs_map[scraped_attr['name']] = scraped_obj_attr
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.RunPython(add_youtube_scraper)
]
}}}
When i run python manage.py migrate i get the following error:
{{{
Running migrations:
Applying content_scraper.0001_initial...
Traceback (most recent call last):
File "./manage.py", line 11, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/site-
packages/django/core/management/__init__.py", line 385, in
execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/site-
packages/django/core/management/__init__.py", line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/site-
packages/django/core/management/base.py", line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.7/site-
packages/django/core/management/base.py", line 338, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/site-
packages/django/core/management/commands/migrate.py", line 161, in handle
executor.migrate(targets, plan, fake=options.get("fake", False))
File "/usr/local/lib/python2.7/site-
packages/django/db/migrations/executor.py", line 68, in migrate
self.apply_migration(migration, fake=fake)
File "/usr/local/lib/python2.7/site-
packages/django/db/migrations/executor.py", line 102, in apply_migration
migration.apply(project_state, schema_editor)
File "/usr/local/lib/python2.7/site-
packages/django/db/migrations/migration.py", line 108, in apply
operation.database_forwards(self.app_label, schema_editor,
project_state, new_state)
File "/usr/local/lib/python2.7/site-
packages/django/db/migrations/operations/special.py", line 117, in
database_forwards
self.code(from_state.render(), schema_editor)
File "/app/content_scraper/migrations/0001_initial.py", line 32, in
add_youtube_scraper
scraped_obj_attr.save()
File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py",
line 589, in save
force_update=force_update, update_fields=update_fields)
File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py",
line 617, in save_base
updated = self._save_table(raw, cls, force_insert, force_update,
using, update_fields)
File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py",
line 698, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk,
raw)
File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py",
line 731, in _do_insert
using=using, raw=raw)
File "/usr/local/lib/python2.7/site-
packages/django/db/models/manager.py", line 92, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py",
line 921, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File "/usr/local/lib/python2.7/site-
packages/django/db/models/sql/compiler.py", line 921, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python2.7/site-
packages/django/db/backends/utils.py", line 82, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/local/lib/python2.7/site-
packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/site-packages/django/db/utils.py", line
94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/lib/python2.7/site-
packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: null value in column "obj_class_id"
violates not-null constraint
DETAIL: Failing row contains (19, base, null, B).
}}}
Basically what i am trying to do is assign a value to a ForeignKey. I
tried printing the value of the created scraper object class and it's 19
as in the last line of the traceback. I also checked the SQL statement
generated:
{{{
INSERT INTO "dynamic_scraper_scrapedobjattr" ("name", "attr_type") VALUES
(%s, %s) RETURNING "dynamic_scraper_scrapedobjattr"."id"
}}}
As you can see the obj_class attribute of the ScrapedObjAttr is omitted,
which is a weird behaviour.
--
Ticket URL: <https://code.djangoproject.com/ticket/24853>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/051.a0bf31a0a3f70d09e6fa8ea8ffd17127%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.