Saturday, January 5, 2019

bulk_create method works wrong for mysql db

I wrote a small test application for the company's list of employees. 
I wrote the custom migration to create the initial data and got problem with python manage.py migrate

Traceback (most recent call last):
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/backends/mysql/base.py", line 71, in execute
   
return self.cursor.execute(query, args)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/MySQLdb/cursors.py", line 255, in execute
   
self.errorhandler(self, exc, value)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
   
raise errorvalue
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/MySQLdb/cursors.py", line 252, in execute
    res
= self._query(query)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/MySQLdb/cursors.py", line 378, in _query
    db
.query(q)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/MySQLdb/connections.py", line 280, in query
    _mysql
.connection.query(self, query)
_mysql_exceptions
.OperationalError: (1048, "Column 'company_id' cannot be null")


During handling of the above exception, another exception occurred:


Traceback (most recent call last):
 
File "manage.py", line 15, in <module>
    execute_from_command_line
(sys.argv)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility
.execute()
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/core/management/__init__.py", line 375, in execute
   
self.fetch_command(subcommand).run_from_argv(self.argv)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/core/management/base.py", line 316, in run_from_argv
   
self.execute(*args, **cmd_options)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/core/management/base.py", line 353, in execute
    output
= self.handle(*args, **options)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/core/management/base.py", line 83, in wrapped
    res
= handle_func(*args, **kwargs)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 203, in handle
    fake_initial
=fake_initial,
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state
= self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state
= self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
    state
= migration.apply(state, schema_editor)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/migrations/migration.py", line 121, in apply
    operation
.database_forwards(self.app_label, schema_editor, old_state, project_state)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/migrations/operations/special.py", line 190, in database_forwards
   
self.code(from_state.apps, schema_editor)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django_print_sql/print_sql.py", line 64, in wrapped
   
return func(*fargs, **fkwargs)
 
File "/home/mykola/projects/company/departments/migrations/0002_initial_creation_data.py", line 36, in create_objects
   
) for index in range(1, NUMBER)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/models/manager.py", line 82, in manager_method
   
return getattr(self.get_queryset(), name)(*args, **kwargs)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/models/query.py", line 465, in bulk_create
    ids
= self._batched_insert(objs_without_pk, fields, batch_size)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/models/query.py", line 1155, in _batched_insert
   
self._insert(item, fields=fields, using=self.db)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/models/query.py", line 1136, in _insert
   
return query.get_compiler(using=using).execute_sql(return_id)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1289, in execute_sql
    cursor
.execute(sql, params)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/backends/utils.py", line 100, in execute
   
return super().execute(sql, params)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/backends/utils.py", line 68, in execute
   
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
   
return executor(sql, params, many, context)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/backends/utils.py", line 85, in _execute
   
return self.cursor.execute(sql, params)
 
File "/home/mykola/.virtualenvs/employees/lib/python3.5/site-packages/django/db/backends/mysql/base.py", line 76, in execute
   
raise utils.IntegrityError(*tuple(e.args))
django
.db.utils.IntegrityError: (1048, "Column 'company_id' cannot be null")


my code of migration:

# Generated by Django 2.1.4 on 2019-01-01 14:37
import names
import random
from django.db import migrations


COMPANY_MODEL
= "Company"
COMPANY_NAME
= "Codecademy"
NUMBER
= 11




def create_objects(apps, schema_editor):


    company_model
= apps.get_model("departments", COMPANY_MODEL)
    company
= company_model.objects.bulk_create([
        company_model
(name=COMPANY_NAME)
   
])[0]


    department_model
= apps.get_model("departments", "Department")


    departments
= department_model.objects.bulk_create([
        department_model
(
            name
="Department_{number}".format(
                number
=index
           
),
            company
=company
       
) for index in range(1, NUMBER)
   
])


    employee_model
= apps.get_model("departments", "Employee")


   
for department in departments:
        employee_model
.objects.bulk_create([
            employee_model
(
                name
=names.get_full_name(),
                active
=random.choice([True, False]),
                department
=department
           
) for _ in range(1, NUMBER)
       
])




def rollback_migration(apps, schema_editor):
    company_model
= apps.get_model("departments", COMPANY_MODEL)
    company_model
.objects.get(name=COMPANY_NAME).delete()




class Migration(migrations.Migration):


    dependencies
= [
       
('departments', '0001_initial'),
   
]


    operations
= [
        migrations
.RunPython(code=create_objects, reverse_code=rollback_migration)
   
]



I plaing in django console and I saw that this bulk_create() method create company object in db, but return [<Company: Company object (None)>] and I can not refresh_from_db() this object because it rise departments.models.Company.DoesNotExist: Company matching query does not exist. 
The most important thing is that there is no problem with postgresql bd!!! Can anyone help me? It looks like I found a bug...
Django version 2.1
project code:

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/204312ad-d1ab-4c76-83f3-1f32e2e6dbde%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment