Sometimes during migrations in django on big tables (>50 millions rows) i receive the following error:
Traceback:
Traceback (most recent call last):
File "src/audit/manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.5/dist-packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.5/dist-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.5/dist-packages/django/core/management/commands/migrate.py", line 204, in handle
fake_initial=fake_initial,
File "/usr/local/lib/python3.5/dist-packages/django/db/migrations/executor.py", line 115, in migrate
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/usr/local/lib/python3.5/dist-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/usr/local/lib/python3.5/dist-packages/django/db/migrations/executor.py", line 244, in apply_migration
state = migration.apply(state, schema_editor)
File "/usr/local/lib/python3.5/dist-packages/django/db/migrations/migration.py", line 129, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/usr/local/lib/python3.5/dist-packages/django/db/migrations/operations/fields.py", line 86, in database_forwards
field,
File "/usr/local/lib/python3.5/dist-packages/django/db/backends/base/schema.py", line 439, in add_field
self.execute(sql)
File "/usr/local/lib/python3.5/dist-packages/django/db/backends/base/schema.py", line 120, in execute
cursor.execute(sql, params)
File "/usr/local/lib/python3.5/dist-packages/django/db/backends/utils.py", line 80, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/local/lib/python3.5/dist-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.5/dist-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/lib/python3.5/dist-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.5/dist-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
django.db.utils.OperationalError: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Can you please give me advice - which postgres settings i should change in order to solve this issue?
I try set statement_timeout = 0, idle_in_transaction_session_timeout = 0 with no result.
Migration:
class Migration(migrations.Migration):
dependencies = [
('core', '0028_auto_'),
]
operations = [
migrations.AddField(
model_name='risk',
name='test3',
field=models.CharField(default='testme', max_length=50),
),
]
SQL:
BEGIN;
--
-- Add field test3 to risk
--
ALTER TABLE "core_risk" ADD COLUMN "test3" varchar(50) DEFAULT 'testme' NOT NULL;
ALTER TABLE "core_risk" ALTER COLUMN "test3" DROP DEFAULT;
COMMIT;
Related
I have a logging table,which is being continuously written to,in which i want to add a column,it's migration works fine on local but it's getting timed out on deployment
This is the migration file a have:
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("request_log", "0004_requestlog2"),
]
operations = [
migrations.AddField(
model_name="requestlog2",
name="request_type",
field=models.PositiveSmallIntegerField(
blank=True,
choices=[(0, "Incoming"), (1, "Outgoing"), (2, "Internal")],
help_text="State the type on request",
null=True,
),
),
]
This is the migration logs:
Rendering model states... DONE
Applying request_log.0005_requestlog2_request_type...django 21/Oct/2022:15:12:54,194347 +0000 [INFO] squadrun.sentry_helpers: thread=140715699507328 extra: exchash: b8ca65d21d0d448f8fe90658c0708923 detected
Traceback (most recent call last):
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/elasticapm/instrumentation/packages/dbapi2.py", line 210, in execute
return self._trace_sql(self.__wrapped__.execute, sql, params)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/elasticapm/instrumentation/packages/dbapi2.py", line 244, in _trace_sql
result = method(sql, params)
psycopg2.extensions.QueryCanceledError: canceling statement due to statement timeout
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 40, in <module>
execute_from_command_line(sys.argv)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
utility.execute()
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/core/management/__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/core/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/core/management/base.py", line 399, in execute
output = self.handle(*args, **options)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 200, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/migrations/executor.py", line 92, in migrate
self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/migrations/executor.py", line 198, in apply_migration
state = migration.apply(state, schema_editor)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/migrations/migration.py", line 123, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/migrations/operations/fields.py", line 62, in database_forwards
field,
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/contrib/gis/db/backends/postgis/schema.py", line 69, in add_field
super(PostGISSchemaEditor, self).add_field(model, field)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 396, in add_field
self.execute(sql, params)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 110, in execute
cursor.execute(sql, params)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/sentry_sdk/integrations/django/__init__.py", line 446, in execute
return real_execute(self, sql, params)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/elasticapm/instrumentation/packages/dbapi2.py", line 210, in execute
return self._trace_sql(self.__wrapped__.execute, sql, params)
File "/storage/.pyenv/versions/3.5.9/envs/squadrun_python3.5/lib/python3.5/site-packages/elasticapm/instrumentation/packages/dbapi2.py", line 244, in _trace_sql
result = method(sql, params)
django.db.utils.OperationalError: canceling statement due to statement timeout
Sentry is attempting to send 0 pending error messages
Waiting up to 2 seconds
Press Ctrl-C to quit
This is the Query which query which is getting timed out:
ALTER TABLE "request_log_requestlog2" ADD COLUMN "request_type" smallint NULL CHECK ("request_type" >= 0)
my best guess is that “ALTER TABLE” command is trying to get a lock on the entire table
but since the table is being continuously written to, it’s not able to get the lock in time
Can someone help me with this?
I have been tryed to change a django model by applying and running migrations but I have been getting this error django.db.utils.IntegrityError: UNIQUE constraint failed: new__startup_home_mates.user_id How can this error be fixed? I have already investigated a lot but I have found nothing that fits my situation. I have already tried to use RenameField and AlterField directly from the migrations file and it is still not working maybe I was doing it wrong.
models.py
class Mates(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='usermates', unique=True)
users_requests = models.ManyToManyField(User, related_name="users_requests")
req_bio = models.CharField(max_length=400)
req_image = models.ImageField(upload_to='requestmates_pics', null=True, blank=True, default=False)
traceback
Traceback (most recent call last):
File "manage.py", line 21, in <module>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
utility.execute()
File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\management\__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\management\base.py", line 328, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\management\base.py", line 369, in execute
output = self.handle(*args, **options)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\management\base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\core\management\commands\migrate.py", line 231, in handle
post_migrate_state = executor.migrate(
File "C:\Users\USER\Envs\startup\lib\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 "C:\Users\USER\Envs\startup\lib\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 "C:\Users\USER\Envs\startup\lib\site-packages\django\db\migrations\executor.py", line 245, in apply_migration
state = migration.apply(state, schema_editor)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\migrations\migration.py", line 124, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\migrations\operations\fields.py", line 249, in database_forwards
schema_editor.alter_field(from_model, from_field, to_field)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\sqlite3\schema.py", line 138, in alter_field
super().alter_field(model, old_field, new_field, strict=strict)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\base\schema.py", line 564, in alter_field
self._alter_field(model, old_field, new_field, old_type, new_type,
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\sqlite3\schema.py", line 360, in _alter_field
self._remake_table(model, alter_field=(old_field, new_field))
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\sqlite3\schema.py", line 283, in _remake_table
self.execute("INSERT INTO %s (%s) SELECT %s FROM %s" % (
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\base\schema.py", line 142, in execute
cursor.execute(sql, params)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\utils.py", line 100, in execute
return super().execute(sql, params)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\utils.py", line 68, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "C:\Users\USER\Envs\startup\lib\site-packages\django\db\backends\sqlite3\base.py", line 396, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: new__startup_home_mates.user_id
If you need to see more code please let me know:)
You may added a primary key / id with your models later, but previous database does not have it.
If you add new features to models, add default='something', or null=True,blank=True as arguments. So that old database won't need the unique constraints/value
I suspect that your problem is with your OnetoOneField with unique set to True. You should change this to a ForeignKey (and don't set Unique = True). This is so that users can have more than one mate. That is if I have correctly understood your model setup and what you are trying to achieve.
Here is a good summary of the differences between OnetoOneField and ForeignKey:
What's the difference between django OneToOneField and ForeignKey?
my app named mainsite
I have the table class named Weather in models.py
class Weather(models.Model):
tpr = models.CharField(max_length=5)
wet = models.CharField(max_length=5)
ur = models.CharField(max_length=5)
li = models.CharField(max_length=5)
observe_time = models.DateTimeField(default=None)
I don't want my observe_time set any deafult value
So I set to None .
I have made migrations.
when I made migrate
Then the traceback happen:
File "manage.py", line 22, in
execute_from_command_line(sys.argv)
File "C:\Users\User\Anaconda3\lib\site-packages\django\core\management__init__.py",
line 354, in execute_from_command_line
utility.execute() File "C:\Users\User\Anaconda3\lib\site-packages\django\core\management\__init__.py",
line 346, in execute
self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\Users\User\Anaconda3\lib\site-packages\django\core\management\base.py",
line 394, in run_from_argv
self.execute(*args, **cmd_options) File "C:\Users\User\Anaconda3\lib\site-packages\django\core\management\base.py",
line 445, in execute
output = self.handle(*args, **options) File "C:\Users\User\Anaconda3\lib\site-packages\django\core\management\commands\migrate.py",
line 222, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial) File
"C:\Users\User\Anaconda3\lib\site-packages\django\db\migrations\executor.py",
line 110, in migrate
self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial) File
"C:\Users\User\Anaconda3\lib\site-packages\django\db\migrations\executor.py",
line 148, in apply_migration
state = migration.apply(state, schema_editor) File "C:\Users\User\Anaconda3\lib\site-packages\django\db\migrations\migration.py",
line 115, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state) File
"C:\Users\User\Anaconda3\lib\site-packages\django\db\migrations\operations\fields.py",
line 62, in database_forwards
field, File "C:\Users\User\Anaconda3\lib\site-packages\django\db\backends\sqlite3\schema.py",
line 179, in add_field
self._remake_table(model, create_fields=[field]) File "C:\Users\User\Anaconda3\lib\site-packages\django\db\backends\sqlite3\schema.py",
line 147, in _remake_table
self.quote_name(model._meta.db_table), File "C:\Users\User\Anaconda3\lib\site-packages\django\db\backends\base\schema.py",
line 111, in execute
cursor.execute(sql, params) File "C:\Users\User\Anaconda3\lib\site-packages\django\db\backends\utils.py",
line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params) File "C:\Users\User\Anaconda3\lib\site-packages\django\db\backends\utils.py",
line 64, in execute
return self.cursor.execute(sql, params) File "C:\Users\User\Anaconda3\lib\site-packages\django\db\utils.py", line
98, in exit
six.reraise(dj_exc_type, dj_exc_value, traceback) File "C:\Users\User\Anaconda3\lib\site-packages\django\utils\six.py", line
685, in reraise
raise value.with_traceback(tb) File "C:\Users\User\Anaconda3\lib\site-packages\django\db\backends\utils.py",
line 64, in execute
return self.cursor.execute(sql, params) File "C:\Users\User\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py",
line 318, in execute
return Database.Cursor.execute(self, query, params) django.db.utils.IntegrityError: NOT NULL constraint failed:
mainsite_weather__new.observe_time
I don't know what caused this error.
thx.
In order for this to work you should also make this field nullable and blankable, like this:
observe_time = models.DateTimeField(default=None, blank=True, null=True)
or omit default=None completely, like this:
observe_time = models.DateTimeField(blank=True, null=True)
Also, after that, don't forget to delete the previous migration file and run makemigrations and migrate again.
I am using PostgreSQL as my database and using django tenant schemas. But when I run the following command python manage.py migrate_schemas --shared I get the error saying
(checkpoint_env)
G:\Django_Projects\RackNole\checkpoint_shashi_2\checkpoint_shashi_2>python manage.py migrate_schemas --shared
System check identified some issues:
WARNINGS:
checkpoint.MultiSelectResponse.response: (fields.W340) null has no effect on ManyToManyField.
=== Running migrate for schema public
System check identified some issues:
WARNINGS:
checkpoint.MultiSelectResponse.response: (fields.W340) null has no effect on ManyToManyField.
Operations to perform:
Apply all migrations: website, checkpoint, account, django_comments, redirects, core, admin, twitter, galleries, tastypie, customers, auth, sites, blog, generic, contenttypes, sessions, conf, forms, pages, socialaccount
Running migrations:
Rendering model states... DONE
Applying core.0002_auto_20150414_2140...Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\core\management\__init__.py", line 350, in execute_from_command_line
utility.execute()
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\core\management\__init__.py", line 342, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\core\management\base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\core\management\base.py", line 399, in execute
output = self.handle(*args, **options)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\tenant_schemas\management\commands\migrate_schemas.py", line 42, in handle
self.run_migrations(self.schema_name, settings.SHARED_APPS)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\tenant_schemas\management\commands\migrate_schemas.py", line 65, in run_migrations
command.execute(*self.args, **self.options)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\core\management\base.py", line 399, in execute
output = self.handle(*args, **options)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\core\management\commands\migrate.py", line 200, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\migrations\executor.py", line 92, in migrate
self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\migrations\executor.py", line 121, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\migrations\executor.py", line 198, in apply_migration
state = migration.apply(state, schema_editor)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\migrations\migration.py", line 123, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\migrations\operations\fields.py", line 201, in database_forwards
schema_editor.alter_field(from_model, from_field, to_field)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\backends\base\schema.py", line 482, in alter_field
old_db_params, new_db_params, strict)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\backends\base\schema.py", line 491, in _alter_field
fk_names = self._constraint_names(model, [old_field.column], foreign_key=True)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\backends\base\schema.py", line 911, in _constraint_names
constraints = self.connection.introspection.get_constraints(cursor, model._meta.db_table)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\tenant_schemas\postgresql_backend\introspection.py", line 287, in get_constraints
'table': table_name,
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\backends\utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\backends\utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "G:\Py_Envs\Racknole\checkpoint_env\lib\site-packages\django\db\backends\utils.py", line 64, in execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: column am.amcanorder does not exist
LINE 13: WHEN am.amcanorder THEN
In PostgreSQL up to 9.5 amcanorder was pg_am catalog column. In PostgreSQL 9.6 it was removed. Apparently, django-tenant-schemas uses it.
I recently changed a date field to an integer field (the data was specified in number of months remaining rather than a date).
However all though the make migrations command works fine when I attempt to migrate this fails with a typecast error (note using postgres 9.5). Note there was only 1 instance/entry of the model, which I have also now deleted and the migrate still fails for some reason?
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: cannot cast type date to integer
LINE 1: ...end_date_fixed" TYPE integer USING "end_date_fixed"::integer
^
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
utility.execute()
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/core/management/__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/core/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/core/management/base.py", line 399, in execute
output = self.handle(*args, **options)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 200, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/migrations/executor.py", line 92, in migrate
self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/migrations/executor.py", line 198, in apply_migration
state = migration.apply(state, schema_editor)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/migrations/migration.py", line 123, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/migrations/operations/fields.py", line 201, in database_forwards
schema_editor.alter_field(from_model, from_field, to_field)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 482, in alter_field
old_db_params, new_db_params, strict)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/backends/postgresql/schema.py", line 110, in _alter_field
new_db_params, strict,
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 634, in _alter_field
params,
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 110, in execute
cursor.execute(sql, params)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/Users/Yunti/.virtualenvs/switcher5/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: cannot cast type date to integer
LINE 1: ...end_date_fixed" TYPE integer USING "end_date_fixed"::integer
If the table is empty.
Do the migration in two simple steps. Step 1, drop the existing date column from the model. Step 2 add a new INTEGER column with the same column name.
If the table is not empty.
Edit your model to change the type of end_date_fixed to integer as you have done. Do the make migrations, the open the migrations and delete everything inside migrations[] then replacce it with
migrations.RunSQL("ALTER TABLE mytable ALTER end_date_fixed TYPE INTEGER USING EXTRACT(epoch FROM end_date_fixed)
Make sure that you have not made any other changes to the model when you try this method.