Fixed #31076 -- Fixed dbshell crash on Windows with Python < 3.8.

subprocess.run()'s args parameter accepts path-like objects on Windows
since Python 3.8.
This commit is contained in:
Zeynel Özdemir 2019-12-15 00:13:33 +01:00 committed by Mariusz Felisiak
parent 4161e35048
commit 9d40b6bbf4
2 changed files with 34 additions and 1 deletions

View File

@ -7,6 +7,8 @@ class DatabaseClient(BaseDatabaseClient):
executable_name = 'sqlite3' executable_name = 'sqlite3'
def runshell(self): def runshell(self):
# TODO: Remove str() when dropping support for PY37.
# args parameter accepts path-like objects on Windows since Python 3.8.
args = [self.executable_name, args = [self.executable_name,
self.connection.settings_dict['NAME']] str(self.connection.settings_dict['NAME'])]
subprocess.run(args, check=True) subprocess.run(args, check=True)

View File

@ -0,0 +1,31 @@
from pathlib import Path
from subprocess import CompletedProcess
from unittest import mock, skipUnless
from django.db import connection
from django.db.backends.sqlite3.client import DatabaseClient
from django.test import SimpleTestCase
@skipUnless(connection.vendor == 'sqlite', 'SQLite tests.')
class SqliteDbshellCommandTestCase(SimpleTestCase):
def _run_dbshell(self):
"""Run runshell command and capture its arguments."""
def _mock_subprocess_run(*args, **kwargs):
self.subprocess_args = list(*args)
return CompletedProcess(self.subprocess_args, 0)
client = DatabaseClient(connection)
with mock.patch('subprocess.run', new=_mock_subprocess_run):
client.runshell()
return self.subprocess_args
def test_path_name(self):
with mock.patch.dict(
connection.settings_dict,
{'NAME': Path('test.db.sqlite3')},
):
self.assertEqual(
self._run_dbshell(),
['sqlite3', 'test.db.sqlite3'],
)