mirror of https://github.com/django/django.git
[3.2.x] Fixed #32687 -- Restored passing process’ environment to underlying tool in dbshell on PostgreSQL.
Regression inbbe6fbb876
. Backport of6e742dabc9
from main.
This commit is contained in:
parent
34981f399a
commit
55cb3c8ac1
|
@ -21,6 +21,5 @@ class BaseDatabaseClient:
|
|||
|
||||
def runshell(self, parameters):
|
||||
args, env = self.settings_to_cmd_args_env(self.connection.settings_dict, parameters)
|
||||
if env:
|
||||
env = {**os.environ, **env}
|
||||
env = {**os.environ, **env} if env else None
|
||||
subprocess.run(args, env=env, check=True)
|
||||
|
|
|
@ -41,7 +41,7 @@ class DatabaseClient(BaseDatabaseClient):
|
|||
env['PGSSLCERT'] = str(sslcert)
|
||||
if sslkey:
|
||||
env['PGSSLKEY'] = str(sslkey)
|
||||
return args, env
|
||||
return args, (env or None)
|
||||
|
||||
def runshell(self, parameters):
|
||||
sigint_handler = signal.getsignal(signal.SIGINT)
|
||||
|
|
|
@ -65,3 +65,6 @@ Bugfixes
|
|||
admin changelist now uses ``Exists()`` instead ``QuerySet.distinct()``
|
||||
because calling ``delete()`` after ``distinct()`` is not allowed in Django
|
||||
3.2 to address a data loss possibility.
|
||||
|
||||
* Fixed a regression in Django 3.2 where the calling process environment would
|
||||
not be passed to the ``dbshell`` command on PostgreSQL (:ticket:`32687`).
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
from unittest import mock
|
||||
|
||||
from django.db import connection
|
||||
from django.db.backends.base.client import BaseDatabaseClient
|
||||
from django.test import SimpleTestCase
|
||||
|
@ -14,3 +16,15 @@ class SimpleDatabaseClientTests(SimpleTestCase):
|
|||
)
|
||||
with self.assertRaisesMessage(NotImplementedError, msg):
|
||||
self.client.settings_to_cmd_args_env(None, None)
|
||||
|
||||
def test_runshell_use_environ(self):
|
||||
for env in [None, {}]:
|
||||
with self.subTest(env=env):
|
||||
with mock.patch('subprocess.run') as run:
|
||||
with mock.patch.object(
|
||||
BaseDatabaseClient,
|
||||
'settings_to_cmd_args_env',
|
||||
return_value=([], env),
|
||||
):
|
||||
self.client.runshell(None)
|
||||
run.assert_called_once_with([], env=None, check=True)
|
||||
|
|
|
@ -39,7 +39,7 @@ class PostgreSqlDbshellCommandTestCase(SimpleTestCase):
|
|||
'PORT': '444',
|
||||
}), (
|
||||
['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
|
||||
{},
|
||||
None,
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -100,7 +100,7 @@ class PostgreSqlDbshellCommandTestCase(SimpleTestCase):
|
|||
def test_parameters(self):
|
||||
self.assertEqual(
|
||||
self.settings_to_cmd_args_env({'NAME': 'dbname'}, ['--help']),
|
||||
(['psql', 'dbname', '--help'], {}),
|
||||
(['psql', 'dbname', '--help'], None),
|
||||
)
|
||||
|
||||
@skipUnless(connection.vendor == 'postgresql', 'Requires a PostgreSQL connection')
|
||||
|
|
Loading…
Reference in New Issue