#36650: oracledb-3.4.0 -> TypeError: isinstance() arg 2 must be a type, a tuple 
of
types, or a union
-------------------------------------+-------------------------------------
     Reporter:  MV                   |                    Owner:  (none)
         Type:  Uncategorized        |                   Status:  new
    Component:  Database layer       |                  Version:  5.2
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by MV:

Old description:

> When upgrading oracledb to version 3.4.0, Django stops working with error
> "TypeError: isinstance() arg 2 must be a type, a tuple of types, or a
> union."
>
> Using oracledb-3.3.0 works as expected.
>
> ...
> Performing system checks...
>
> System check identified no issues (0 silenced).
> 2025-10-08 09:18:33,020: INFO: acst_app.models.file: 10001
> 2025-10-08 09:18:33,023: INFO: acst_app.models.file: 10001 elapsed time
> 00m00s
> Exception in thread django-main-thread:
> Traceback (most recent call last):
>   File "/root/.pyenv/versions/3.13.7/lib/python3.13/threading.py", line
> 1043, in _bootstrap_inner
>     self.run()
>     ~~~~~~~~^^
>   File "/root/.pyenv/versions/3.13.7/lib/python3.13/threading.py", line
> 994, in run
>     self._target(*self._args, **self._kwargs)
>     ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/utils/autoreload.py", line 64, in wrapper
>     fn(*args, **kwargs)
>     ~~^^^^^^^^^^^^^^^^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/core/management/commands/runserver.py", line 137, in
> inner_run
>     self.check_migrations()
>     ~~~~~~~~~~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/core/management/base.py", line 587, in check_migrations
>     executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/migrations/executor.py", line 18, in __init__
>     self.loader = MigrationLoader(self.connection)
>                   ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/migrations/loader.py", line 58, in __init__
>     self.build_graph()
>     ~~~~~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/migrations/loader.py", line 235, in build_graph
>     self.applied_migrations = recorder.applied_migrations()
>                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/migrations/recorder.py", line 89, in
> applied_migrations
>     if self.has_table():
>        ~~~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/migrations/recorder.py", line 63, in has_table
>     with self.connection.cursor() as cursor:
>          ~~~~~~~~~~~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/utils/asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/base/base.py", line 320, in cursor
>     return self._cursor()
>            ~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/base/base.py", line 296, in _cursor
>     self.ensure_connection()
>     ~~~~~~~~~~~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/utils/asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/base/base.py", line 279, in ensure_connection
>     self.connect()
>     ~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/utils/asyncio.py", line 26, in inner
>     return func(*args, **kwargs)
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/base/base.py", line 258, in connect
>     self.init_connection_state()
>     ~~~~~~~~~~~~~~~~~~~~~~~~~~^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/oracle/base.py", line 336, in
> init_connection_state
>     cursor.execute(
>     ~~~~~~~~~~~~~~^
>         "SELECT 1 FROM DUAL WHERE DUMMY %s"
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>         % self._standard_operators["contains"],
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>         ["X"],
>         ^^^^^^
>     )
>     ^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/oracle/base.py", line 630, in execute
>     query, params = self._fix_for_params(query, params,
> unify_by_values=True)
> ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/oracle/base.py", line 627, in _fix_for_params
>     return query, self._format_params(params)
>                   ~~~~~~~~~~~~~~~~~~~^^^^^^^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/oracle/base.py", line 555, in _format_params
>     return {k: OracleParam(v, self, True) for k, v in params.items()}
>                ~~~~~~~~~~~^^^^^^^^^^^^^^^
>   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
> packages/django/db/backends/oracle/base.py", line 441, in __init__
>     elif isinstance(param, (Database.Binary, datetime.timedelta)):
>          ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> TypeError: isinstance() arg 2 must be a type, a tuple of types, or a
> union

New description:

 When upgrading oracledb to version 3.4.0, Django stops working with error
 "TypeError: isinstance() arg 2 must be a type, a tuple of types, or a
 union."

 Using oracledb-3.3.0 works as expected.

 ``
 Performing system checks...

 System check identified no issues (0 silenced).
 2025-10-08 09:18:33,020: INFO: acst_app.models.file: 10001
 2025-10-08 09:18:33,023: INFO: acst_app.models.file: 10001 elapsed time
 00m00s
 Exception in thread django-main-thread:
 Traceback (most recent call last):
   File "/root/.pyenv/versions/3.13.7/lib/python3.13/threading.py", line
 1043, in _bootstrap_inner
     self.run()
     ~~~~~~~~^^
   File "/root/.pyenv/versions/3.13.7/lib/python3.13/threading.py", line
 994, in run
     self._target(*self._args, **self._kwargs)
     ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/utils/autoreload.py", line 64, in wrapper
     fn(*args, **kwargs)
     ~~^^^^^^^^^^^^^^^^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/core/management/commands/runserver.py", line 137, in
 inner_run
     self.check_migrations()
     ~~~~~~~~~~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/core/management/base.py", line 587, in check_migrations
     executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/migrations/executor.py", line 18, in __init__
     self.loader = MigrationLoader(self.connection)
                   ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/migrations/loader.py", line 58, in __init__
     self.build_graph()
     ~~~~~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/migrations/loader.py", line 235, in build_graph
     self.applied_migrations = recorder.applied_migrations()
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/migrations/recorder.py", line 89, in applied_migrations
     if self.has_table():
        ~~~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/migrations/recorder.py", line 63, in has_table
     with self.connection.cursor() as cursor:
          ~~~~~~~~~~~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/utils/asyncio.py", line 26, in inner
     return func(*args, **kwargs)
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/base/base.py", line 320, in cursor
     return self._cursor()
            ~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/base/base.py", line 296, in _cursor
     self.ensure_connection()
     ~~~~~~~~~~~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/utils/asyncio.py", line 26, in inner
     return func(*args, **kwargs)
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/base/base.py", line 279, in ensure_connection
     self.connect()
     ~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/utils/asyncio.py", line 26, in inner
     return func(*args, **kwargs)
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/base/base.py", line 258, in connect
     self.init_connection_state()
     ~~~~~~~~~~~~~~~~~~~~~~~~~~^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/oracle/base.py", line 336, in
 init_connection_state
     cursor.execute(
     ~~~~~~~~~~~~~~^
         "SELECT 1 FROM DUAL WHERE DUMMY %s"
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         % self._standard_operators["contains"],
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         ["X"],
         ^^^^^^
     )
     ^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/oracle/base.py", line 630, in execute
     query, params = self._fix_for_params(query, params,
 unify_by_values=True)
 ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/oracle/base.py", line 627, in _fix_for_params
     return query, self._format_params(params)
                   ~~~~~~~~~~~~~~~~~~~^^^^^^^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/oracle/base.py", line 555, in _format_params
     return {k: OracleParam(v, self, True) for k, v in params.items()}
                ~~~~~~~~~~~^^^^^^^^^^^^^^^
   File "/root/.pyenv/versions/django_acst_venv_3137/lib/python3.13/site-
 packages/django/db/backends/oracle/base.py", line 441, in __init__
     elif isinstance(param, (Database.Binary, datetime.timedelta)):
          ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union
 ``

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36650#comment:1>
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 view this discussion visit 
https://groups.google.com/d/msgid/django-updates/01070199c3dd83bd-f7f3327d-4dfd-40f1-8a6c-4eb8023f4269-000000%40eu-central-1.amazonses.com.

Reply via email to