django-docker-box oracle "ORA-28001: The account has expired. The password must be changed."

Hi folks :waving_hand:
Thought I would post here to make this easy to link in case anyone else has this issue in future

I have been using django-docker-box to run some oracle tests and have gotten the following error:

Testing against Django installed in '/django/source/django' with up to 12 processes
Found 1 test(s).
Creating test database for alias 'default'...
Traceback (most recent call last):
  File "/django/source/django/db/backends/base/base.py", line 279, in ensure_connection
    self.connect()
    ~~~~~~~~~~~~^^
  File "/django/source/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/django/source/django/db/backends/base/base.py", line 256, in connect
    self.connection = self.get_new_connection(conn_params)
                      ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "/django/source/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/django/source/django/db/backends/oracle/base.py", line 304, in get_new_connection
    return Database.connect(
           ~~~~~~~~~~~~~~~~^
        user=self.settings_dict["USER"],
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        **conn_params,
        ^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.14/site-packages/oracledb/connection.py", line 1698, in connect
    return conn_class(dsn=dsn, pool=pool, params=params, **kwargs)
  File "/usr/local/lib/python3.14/site-packages/oracledb/connection.py", line 892, in __init__
    impl.connect(params_impl)
    ~~~~~~~~~~~~^^^^^^^^^^^^^
  File "src/oracledb/impl/thin/connection.pyx", line 526, in oracledb.thin_impl.ThinConnImpl.connect
  File "src/oracledb/impl/thin/connection.pyx", line 522, in oracledb.thin_impl.ThinConnImpl.connect
  File "src/oracledb/impl/thin/connection.pyx", line 465, in oracledb.thin_impl.ThinConnImpl._connect_with_params
  File "src/oracledb/impl/thin/connection.pyx", line 446, in oracledb.thin_impl.ThinConnImpl._connect_with_description
  File "src/oracledb/impl/thin/connection.pyx", line 415, in oracledb.thin_impl.ThinConnImpl._connect_with_address
  File "src/oracledb/impl/thin/protocol.pyx", line 368, in oracledb.thin_impl.Protocol._connect_phase_two
  File "src/oracledb/impl/thin/protocol.pyx", line 494, in oracledb.thin_impl.Protocol._process_message
  File "src/oracledb/impl/thin/messages/base.pyx", line 102, in oracledb.thin_impl.Message._check_and_raise_exception
oracledb.exceptions.DatabaseError: ORA-28001: The account has expired. The password must be changed.
Help: https://docs.oracle.com/error-help/db/ora-28001/                                                                                                                                                                     

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

Traceback (most recent call last):
  File "/django/source/tests/runtests.py", line 782, in <module>
    failures = django_tests(
        options.verbosity,
    ...<16 lines>...
        getattr(options, "durations", None),
    )
  File "/django/source/tests/runtests.py", line 409, in django_tests
    failures = test_runner.run_tests(test_labels)
  File "/django/source/django/test/runner.py", line 1126, in run_tests
    old_config = self.setup_databases(
        aliases=databases,
        serialized_aliases=suite.serialized_aliases,
    )
  File "/django/source/django/test/runner.py", line 1025, in setup_databases
    return _setup_databases(
        self.verbosity,
    ...<5 lines>...
        **kwargs,
    )
  File "/django/source/django/test/utils.py", line 206, in setup_databases
    connection.creation.create_test_db(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        verbosity=verbosity,
        ^^^^^^^^^^^^^^^^^^^^
        autoclobber=not interactive,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        keepdb=keepdb,
        ^^^^^^^^^^^^^^
    )
    ^
  File "/django/source/django/db/backends/base/creation.py", line 75, in create_test_db
    self._create_test_db(verbosity, autoclobber, keepdb)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/django/source/django/db/backends/oracle/creation.py", line 33, in _create_test_db
    with self._maindb_connection.cursor() as cursor:
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/django/source/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/django/source/django/db/backends/base/base.py", line 320, in cursor
    return self._cursor()
           ~~~~~~~~~~~~^^
  File "/django/source/django/db/backends/base/base.py", line 296, in _cursor
    self.ensure_connection()
    ~~~~~~~~~~~~~~~~~~~~~~^^
  File "/django/source/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/django/source/django/db/backends/base/base.py", line 278, in ensure_connection
    with self.wrap_database_errors:
         ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/django/source/django/db/utils.py", line 94, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/django/source/django/db/backends/base/base.py", line 279, in ensure_connection
    self.connect()
    ~~~~~~~~~~~~^^
  File "/django/source/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/django/source/django/db/backends/base/base.py", line 256, in connect
    self.connection = self.get_new_connection(conn_params)
                      ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "/django/source/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/django/source/django/db/backends/oracle/base.py", line 304, in get_new_connection
    return Database.connect(
           ~~~~~~~~~~~~~~~~^
        user=self.settings_dict["USER"],
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        **conn_params,
        ^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.14/site-packages/oracledb/connection.py", line 1698, in connect
    return conn_class(dsn=dsn, pool=pool, params=params, **kwargs)
  File "/usr/local/lib/python3.14/site-packages/oracledb/connection.py", line 892, in __init__
    impl.connect(params_impl)
    ~~~~~~~~~~~~^^^^^^^^^^^^^
  File "src/oracledb/impl/thin/connection.pyx", line 526, in oracledb.thin_impl.ThinConnImpl.connect
  File "src/oracledb/impl/thin/connection.pyx", line 522, in oracledb.thin_impl.ThinConnImpl.connect
  File "src/oracledb/impl/thin/connection.pyx", line 465, in oracledb.thin_impl.ThinConnImpl._connect_with_params
  File "src/oracledb/impl/thin/connection.pyx", line 446, in oracledb.thin_impl.ThinConnImpl._connect_with_description
  File "src/oracledb/impl/thin/connection.pyx", line 415, in oracledb.thin_impl.ThinConnImpl._connect_with_address
  File "src/oracledb/impl/thin/protocol.pyx", line 368, in oracledb.thin_impl.Protocol._connect_phase_two
  File "src/oracledb/impl/thin/protocol.pyx", line 494, in oracledb.thin_impl.Protocol._process_message
  File "src/oracledb/impl/thin/messages/base.pyx", line 102, in oracledb.thin_impl.Message._check_and_raise_exception
django.db.utils.DatabaseError: ORA-28001: The account has expired. The password must be changed.
Help: https://docs.oracle.com/error-help/db/ora-28001/   

I have been trying to run some SQL to unlock the users but without success. Has anyone come across this before?

1 Like

This isn’t a real solution, but my usual tricks when running into things like this is to either delete the containers or failing that, bumping the version number in .env to 23.9.0.0 to pull a new image. Does that help?

This helped! Thank you :star: