mirror of
https://github.com/django/django.git
synced 2025-01-03 06:55:47 +00:00
Fixed #32687 -- Restored passing process’ environment to underlying tool in dbshell on PostgreSQL.
Regression in bbe6fbb876
.
This commit is contained in:
parent
1871182031
commit
6e742dabc9
@ -21,6 +21,5 @@ class BaseDatabaseClient:
|
|||||||
|
|
||||||
def runshell(self, parameters):
|
def runshell(self, parameters):
|
||||||
args, env = self.settings_to_cmd_args_env(self.connection.settings_dict, parameters)
|
args, env = self.settings_to_cmd_args_env(self.connection.settings_dict, parameters)
|
||||||
if env:
|
env = {**os.environ, **env} if env else None
|
||||||
env = {**os.environ, **env}
|
|
||||||
subprocess.run(args, env=env, check=True)
|
subprocess.run(args, env=env, check=True)
|
||||||
|
@ -51,7 +51,7 @@ class DatabaseClient(BaseDatabaseClient):
|
|||||||
env['PGSSLKEY'] = str(sslkey)
|
env['PGSSLKEY'] = str(sslkey)
|
||||||
if passfile:
|
if passfile:
|
||||||
env['PGPASSFILE'] = str(passfile)
|
env['PGPASSFILE'] = str(passfile)
|
||||||
return args, env
|
return args, (env or None)
|
||||||
|
|
||||||
def runshell(self, parameters):
|
def runshell(self, parameters):
|
||||||
sigint_handler = signal.getsignal(signal.SIGINT)
|
sigint_handler = signal.getsignal(signal.SIGINT)
|
||||||
|
@ -65,3 +65,6 @@ Bugfixes
|
|||||||
admin changelist now uses ``Exists()`` instead ``QuerySet.distinct()``
|
admin changelist now uses ``Exists()`` instead ``QuerySet.distinct()``
|
||||||
because calling ``delete()`` after ``distinct()`` is not allowed in Django
|
because calling ``delete()`` after ``distinct()`` is not allowed in Django
|
||||||
3.2 to address a data loss possibility.
|
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 import connection
|
||||||
from django.db.backends.base.client import BaseDatabaseClient
|
from django.db.backends.base.client import BaseDatabaseClient
|
||||||
from django.test import SimpleTestCase
|
from django.test import SimpleTestCase
|
||||||
@ -14,3 +16,15 @@ class SimpleDatabaseClientTests(SimpleTestCase):
|
|||||||
)
|
)
|
||||||
with self.assertRaisesMessage(NotImplementedError, msg):
|
with self.assertRaisesMessage(NotImplementedError, msg):
|
||||||
self.client.settings_to_cmd_args_env(None, None)
|
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',
|
'PORT': '444',
|
||||||
}), (
|
}), (
|
||||||
['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
|
['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
|
||||||
{},
|
None,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ class PostgreSqlDbshellCommandTestCase(SimpleTestCase):
|
|||||||
def test_parameters(self):
|
def test_parameters(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
self.settings_to_cmd_args_env({'NAME': 'dbname'}, ['--help']),
|
self.settings_to_cmd_args_env({'NAME': 'dbname'}, ['--help']),
|
||||||
(['psql', 'dbname', '--help'], {}),
|
(['psql', 'dbname', '--help'], None),
|
||||||
)
|
)
|
||||||
|
|
||||||
@skipUnless(connection.vendor == 'postgresql', 'Requires a PostgreSQL connection')
|
@skipUnless(connection.vendor == 'postgresql', 'Requires a PostgreSQL connection')
|
||||||
|
Loading…
Reference in New Issue
Block a user