Skip to content

ssl_require parameter incorrectly mapped for mysql/mysqlclient (sslmode vs ssl_mode) #280

@raphaelw

Description

@raphaelw

Error message

TypeError: connect() got an unexpected keyword argument 'sslmode'. Did you mean 'ssl_mode'?

Steps to reproduce

Setup up a Django project and use dj-database-url (via environs) for settings.py. So my pip freeze contains:

Django==5.2.8
mysqlclient==2.2.7
...
python-dotenv==1.2.1
environs==14.5.0
dj-database-url==3.0.1

My settings.py:

from environs import Env
env = Env()
env.read_env()

# ...

DATABASES = {
    "default": env.dj_db_url(
        "DATABASE_URL",
        ssl_require=True,
    ),
}

Workaround

DATABASES = {
    "default": {
        **env.dj_db_url("DATABASE_URL"),
        'OPTIONS': {"ssl_mode": "REQUIRED"}
    }
}

Full error message

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Python313\Lib\threading.py", line 1041, in _bootstrap_inner
    self.run()
    ~~~~~~~~^^
  File "C:\Python313\Lib\threading.py", line 992, in run
    self._target(*self._args, **self._kwargs)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\repo\.venv\Lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
    ~~^^^^^^^^^^^^^^^^^
  File "C:\repo\.venv\Lib\site-packages\django\core\management\commands\runserver.py", line 137, in inner_run
    self.check_migrations()
    ~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\repo\.venv\Lib\site-packages\django\core\management\base.py", line 587, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "C:\repo\.venv\Lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
                  ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "C:\repo\.venv\Lib\site-packages\django\db\migrations\loader.py", line 58, in __init__
    self.build_graph()
    ~~~~~~~~~~~~~~~~^^
  File "C:\repo\.venv\Lib\site-packages\django\db\migrations\loader.py", line 235, in build_graph
    self.applied_migrations = recorder.applied_migrations()
                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\repo\.venv\Lib\site-packages\django\db\migrations\recorder.py", line 89, in applied_migrations
    if self.has_table():
       ~~~~~~~~~~~~~~^^
  File "C:\repo\.venv\Lib\site-packages\django\db\migrations\recorder.py", line 63, in has_table
    with self.connection.cursor() as cursor:
         ~~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\repo\.venv\Lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\repo\.venv\Lib\site-packages\django\db\backends\base\base.py", line 320, in cursor
    return self._cursor()
           ~~~~~~~~~~~~^^
  File "C:\repo\.venv\Lib\site-packages\django\db\backends\base\base.py", line 296, in _cursor
    self.ensure_connection()
    ~~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\repo\.venv\Lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\repo\.venv\Lib\site-packages\django\db\backends\base\base.py", line 279, in ensure_connection
    self.connect()
    ~~~~~~~~~~~~^^
  File "C:\repo\.venv\Lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\repo\.venv\Lib\site-packages\django\db\backends\base\base.py", line 256, in connect
    self.connection = self.get_new_connection(conn_params)
                      ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "C:\repo\.venv\Lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\repo\.venv\Lib\site-packages\django\db\backends\mysql\base.py", line 256, in get_new_connection
    connection = Database.connect(**conn_params)
  File "C:\repo\.venv\Lib\site-packages\MySQLdb\__init__.py", line 121, in Connect
    return Connection(*args, **kwargs)
  File "C:\repo\.venv\Lib\site-packages\MySQLdb\connections.py", line 200, in __init__
    super().__init__(*args, **kwargs2)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
TypeError: connect() got an unexpected keyword argument 'sslmode'. Did you mean 'ssl_mode'?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions