summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Pope <nick@nickpope.me.uk>2021-05-10 21:32:10 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-05-12 13:35:13 +0200
commit4318e60a8025371a6da550eecc798e32d3864f9d (patch)
tree1c7ee67b41d2c6132e22547ffb35bbde96c41b8b
parentcd84f7acfa65775837952bf4d1b654966be3c2cf (diff)
[3.2.x] Fixed #32732 -- Removed usage of deprecated 'db' and 'passwd' connection options in MySQL backend.
The 'db' and 'passwd' connection options have been deprecated, use 'database' and 'password' instead (available since mysqlclient >= 1.3.8). This also allows the 'database' option in DATABASES['OPTIONS'] on MySQL. Backport of 1061f5243646b4c9b8a758f8a36c9e2ccdded1cf from main
-rw-r--r--django/db/backends/mysql/base.py4
-rw-r--r--django/db/backends/mysql/client.py9
-rw-r--r--docs/releases/3.2.3.txt2
-rw-r--r--tests/dbshell/test_mysql.py50
4 files changed, 38 insertions, 27 deletions
diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py
index 4cd9e14fed..a8dcc7c72a 100644
--- a/django/db/backends/mysql/base.py
+++ b/django/db/backends/mysql/base.py
@@ -201,9 +201,9 @@ class DatabaseWrapper(BaseDatabaseWrapper):
if settings_dict['USER']:
kwargs['user'] = settings_dict['USER']
if settings_dict['NAME']:
- kwargs['db'] = settings_dict['NAME']
+ kwargs['database'] = settings_dict['NAME']
if settings_dict['PASSWORD']:
- kwargs['passwd'] = settings_dict['PASSWORD']
+ kwargs['password'] = settings_dict['PASSWORD']
if settings_dict['HOST'].startswith('/'):
kwargs['unix_socket'] = settings_dict['HOST']
elif settings_dict['HOST']:
diff --git a/django/db/backends/mysql/client.py b/django/db/backends/mysql/client.py
index 95442a32b0..7cbe314afe 100644
--- a/django/db/backends/mysql/client.py
+++ b/django/db/backends/mysql/client.py
@@ -8,7 +8,10 @@ class DatabaseClient(BaseDatabaseClient):
def settings_to_cmd_args_env(cls, settings_dict, parameters):
args = [cls.executable_name]
env = None
- db = settings_dict['OPTIONS'].get('db', settings_dict['NAME'])
+ database = settings_dict['OPTIONS'].get(
+ 'database',
+ settings_dict['OPTIONS'].get('db', settings_dict['NAME']),
+ )
user = settings_dict['OPTIONS'].get('user', settings_dict['USER'])
password = settings_dict['OPTIONS'].get(
'password',
@@ -51,7 +54,7 @@ class DatabaseClient(BaseDatabaseClient):
args += ["--ssl-key=%s" % client_key]
if charset:
args += ['--default-character-set=%s' % charset]
- if db:
- args += [db]
+ if database:
+ args += [database]
args.extend(parameters)
return args, env
diff --git a/docs/releases/3.2.3.txt b/docs/releases/3.2.3.txt
index 9b1d9521d1..14a143b203 100644
--- a/docs/releases/3.2.3.txt
+++ b/docs/releases/3.2.3.txt
@@ -9,4 +9,4 @@ Django 3.2.3 fixes several bugs in 3.2.2.
Bugfixes
========
-* ...
+* Prepared for ``mysqlclient`` > 2.0.3 support (:ticket:`32732`).
diff --git a/tests/dbshell/test_mysql.py b/tests/dbshell/test_mysql.py
index c3ecc6503b..b1e8e8a5c9 100644
--- a/tests/dbshell/test_mysql.py
+++ b/tests/dbshell/test_mysql.py
@@ -50,41 +50,49 @@ class MySqlDbshellCommandTestCase(SimpleTestCase):
'optiondbname',
]
expected_env = {'MYSQL_PWD': 'optionpassword'}
- self.assertEqual(
- self.settings_to_cmd_args_env({
- 'NAME': 'settingdbname',
- 'USER': 'settinguser',
- 'PASSWORD': 'settingpassword',
- 'HOST': 'settinghost',
- 'PORT': settings_port,
- 'OPTIONS': {
- 'db': 'optiondbname',
- 'user': 'optionuser',
- 'passwd': 'optionpassword',
- 'host': 'optionhost',
- 'port': options_port,
- },
- }),
- (expected_args, expected_env),
- )
+ for keys in [('database', 'password'), ('db', 'passwd')]:
+ with self.subTest(keys=keys):
+ database, password = keys
+ self.assertEqual(
+ self.settings_to_cmd_args_env({
+ 'NAME': 'settingdbname',
+ 'USER': 'settinguser',
+ 'PASSWORD': 'settingpassword',
+ 'HOST': 'settinghost',
+ 'PORT': settings_port,
+ 'OPTIONS': {
+ database: 'optiondbname',
+ 'user': 'optionuser',
+ password: 'optionpassword',
+ 'host': 'optionhost',
+ 'port': options_port,
+ },
+ }),
+ (expected_args, expected_env),
+ )
- def test_options_password(self):
+ def test_options_non_deprecated_keys_preferred(self):
expected_args = [
'mysql',
'--user=someuser',
'--host=somehost',
'--port=444',
- 'somedbname',
+ 'optiondbname',
]
expected_env = {'MYSQL_PWD': 'optionpassword'}
self.assertEqual(
self.settings_to_cmd_args_env({
- 'NAME': 'somedbname',
+ 'NAME': 'settingdbname',
'USER': 'someuser',
'PASSWORD': 'settingpassword',
'HOST': 'somehost',
'PORT': 444,
- 'OPTIONS': {'password': 'optionpassword'},
+ 'OPTIONS': {
+ 'database': 'optiondbname',
+ 'db': 'deprecatedoptiondbname',
+ 'password': 'optionpassword',
+ 'passwd': 'deprecatedoptionpassword',
+ },
}),
(expected_args, expected_env),
)