[Django] #33858: Altering model field from bigint to jsonb in postgres database fails

62 views
Skip to first unread message

Django

unread,
Jul 20, 2022, 11:04:04 AM7/20/22
to django-...@googlegroups.com
#33858: Altering model field from bigint to jsonb in postgres database fails
-------------------------------------+-------------------------------------
Reporter: | Owner: nobody
benzdouglas |
Type: Bug | Status: new
Component: | Version: 3.2
Migrations | Keywords: migration, json,
Severity: Normal | jsonb, postgres
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
I created a field for a model that I initially wanted to be a foreign key,
but then decided I wanted the field to be a JSON object to store just a
bit of information instead. But when changing the field type and then
trying to migrate the system gave me an error - it seems that Postgres
does not like casting values from one to the other, understandably. The
first time it happened I went down a dark rabbit hole that ended up in me
completely remaking the entire database, which was painful, and the second
time I just renamed the field, deleted the original, made some
modifications to the migration file, and changed the name back - which was
also a pain but not as bad and a viable workaround.

Here is the terminal output when running the migrate (the field being
changed is 'dependent_on_question' on the 'intake' app/model):

{{{
python manage.py migrate

Operations to perform:
Apply all migrations: [blah blah blah]
Running migrations:
Applying intake.0002_alter_intakequestion_options_and_more...Traceback
(most recent call last):
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/utils.py", line 89, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.CannotCoerce: cannot cast type bigint to jsonb
LINE 1: ...on_question" TYPE jsonb USING "dependent_on_question"::jsonb
^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/Users/[my user]/Sites/[my project]/api/manage.py", line 22, in
<module>
main()
File "/Users/[my user]/Sites/[my project]/api/manage.py", line 18, in
main
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.9/site-
packages/django/core/management/__init__.py", line 446, in
execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.9/site-
packages/django/core/management/__init__.py", line 440, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.9/site-
packages/django/core/management/base.py", line 414, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.9/site-
packages/django/core/management/base.py", line 460, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.9/site-
packages/django/core/management/base.py", line 98, in wrapped
res = handle_func(*args, **kwargs)
File "/usr/local/lib/python3.9/site-
packages/django/core/management/commands/migrate.py", line 290, in handle
post_migrate_state = executor.migrate(
File "/usr/local/lib/python3.9/site-
packages/django/db/migrations/executor.py", line 131, in migrate
state = self._migrate_all_forwards(
File "/usr/local/lib/python3.9/site-
packages/django/db/migrations/executor.py", line 163, in
_migrate_all_forwards
state = self.apply_migration(
File "/usr/local/lib/python3.9/site-
packages/django/db/migrations/executor.py", line 248, in apply_migration
state = migration.apply(state, schema_editor)
File "/usr/local/lib/python3.9/site-
packages/django/db/migrations/migration.py", line 131, in apply
operation.database_forwards(
File "/usr/local/lib/python3.9/site-
packages/django/db/migrations/operations/fields.py", line 235, in
database_forwards
schema_editor.alter_field(from_model, from_field, to_field)
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/base/schema.py", line 747, in alter_field
self._alter_field(
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/postgresql/schema.py", line 231, in
_alter_field
super()._alter_field(
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/base/schema.py", line 963, in _alter_field
self.execute(
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/base/schema.py", line 192, in execute
cursor.execute(sql, params)
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/utils.py", line 103, in execute
return super().execute(sql, params)
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/utils.py", line 89, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line
91, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.9/site-
packages/django/db/backends/utils.py", line 89, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: cannot cast type bigint to jsonb
LINE 1: ...on_question" TYPE jsonb USING "dependent_on_question"::jsonb
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/33858>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Reply all
Reply to author
Forward
0 new messages