﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
32039	psycop2.extras.register_default_jsonb() crashes with TypeError in Django 3.1.1.	elliottyates	nobody	"In a project that I recently upgraded from Django 3.1.0 to 3.1.1 I'm seeing the following traceback:


{{{
Traceback (most recent call last):
  File ""manage.py"", line 19, in <module>
    execute_from_command_line(sys.argv)
  File ""/opt/libs/lib/python3.8/site-packages/django/core/management/__init__.py"", line 401, in execute_from_command_line
    utility.execute()
  File ""/opt/libs/lib/python3.8/site-packages/django/core/management/__init__.py"", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File ""/opt/libs/lib/python3.8/site-packages/django/core/management/base.py"", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File ""/opt/libs/lib/python3.8/site-packages/django/core/management/base.py"", line 371, in execute
    output = self.handle(*args, **options)
  File ""/opt/libs/lib/python3.8/site-packages/django/core/management/base.py"", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/core/management/commands/migrate.py"", line 92, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/migrations/executor.py"", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/migrations/loader.py"", line 53, in __init__
    self.build_graph()
  File ""/opt/libs/lib/python3.8/site-packages/django/db/migrations/loader.py"", line 216, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File ""/opt/libs/lib/python3.8/site-packages/django/db/migrations/recorder.py"", line 77, in applied_migrations
    if self.has_table():
  File ""/opt/libs/lib/python3.8/site-packages/django/db/migrations/recorder.py"", line 55, in has_table
    with self.connection.cursor() as cursor:
  File ""/opt/libs/lib/python3.8/site-packages/django/utils/asyncio.py"", line 26, in inner
    return func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/base/base.py"", line 259, in cursor
    return self._cursor()
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/base/base.py"", line 235, in _cursor
    self.ensure_connection()
  File ""/opt/libs/lib/python3.8/site-packages/django/utils/asyncio.py"", line 26, in inner
    return func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/base/base.py"", line 219, in ensure_connection
    self.connect()
  File ""/opt/libs/lib/python3.8/site-packages/django/utils/asyncio.py"", line 26, in inner
    return func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/base/base.py"", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File ""/opt/libs/lib/python3.8/site-packages/django/utils/asyncio.py"", line 26, in inner
    return func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/postgresql/base.py"", line 206, in get_new_connection
    psycopg2.extras.register_default_jsonb(conn_or_curs=connection, loads=lambda x: x)
  File ""/opt/libs/lib/python3.8/site-packages/psycopg2/_json.py"", line 155, in register_default_jsonb
    return register_json(conn_or_curs=conn_or_curs, globally=globally,
  File ""/opt/libs/lib/python3.8/site-packages/psycopg2/_json.py"", line 125, in register_json
    register_type(JSON, not globally and conn_or_curs or None)
TypeError: argument 2 must be a connection, cursor or None
}}}

Calling views results in a similar traceback on the first ORM call:

{{{
  File ""/opt/libs/lib/python3.8/site-packages/django/db/models/manager.py"", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/models/query.py"", line 425, in get
    num = len(clone)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/models/query.py"", line 269, in __len__
    self._fetch_all()
  File ""/opt/libs/lib/python3.8/site-packages/django/db/models/query.py"", line 1303, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File ""/opt/libs/lib/python3.8/site-packages/django/db/models/query.py"", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/models/sql/compiler.py"", line 1154, in execute_sql
    cursor = self.connection.cursor()
  File ""/opt/libs/lib/python3.8/site-packages/django/utils/asyncio.py"", line 26, in inner
    return func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/base/base.py"", line 259, in cursor
    return self._cursor()
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/base/base.py"", line 235, in _cursor
    self.ensure_connection()
  File ""/opt/libs/lib/python3.8/site-packages/django/utils/asyncio.py"", line 26, in inner
    return func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/base/base.py"", line 219, in ensure_connection
    self.connect()
  File ""/opt/libs/lib/python3.8/site-packages/django/utils/asyncio.py"", line 26, in inner
    return func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/base/base.py"", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File ""/opt/libs/lib/python3.8/site-packages/django/utils/asyncio.py"", line 26, in inner
    return func(*args, **kwargs)
  File ""/opt/libs/lib/python3.8/site-packages/django/db/backends/postgresql/base.py"", line 206, in get_new_connection
    psycopg2.extras.register_default_jsonb(conn_or_curs=connection, loads=lambda x: x)
  File ""/opt/libs/lib/python3.8/site-packages/psycopg2/_json.py"", line 155, in register_default_jsonb
    return register_json(conn_or_curs=conn_or_curs, globally=globally,
  File ""/opt/libs/lib/python3.8/site-packages/psycopg2/_json.py"", line 125, in register_json
    register_type(JSON, not globally and conn_or_curs or None)
TypeError: argument 2 must be a connection, cursor or None
}}}

This happens with psycop2 2.8.5 and 2.8.6.

Reverting to Django 3.1.0 seems to fix it.

Perhaps related to: https://github.com/django/django/pull/13358/files#diff-aef216ccdc37941bfed98ea3c80f7642L203 from https://code.djangoproject.com/ticket/31956.

Thanks! Happy to provide more info with some guidance."	Bug	closed	Database layer (models, ORM)	3.1	Normal	needsinfo			Unreviewed	0	0	0	0	0	0
