diff options
Diffstat (limited to 'django/db/backends/postgresql/creation.py')
-rw-r--r-- | django/db/backends/postgresql/creation.py | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/django/db/backends/postgresql/creation.py b/django/db/backends/postgresql/creation.py index 13eea0d3b7..dcb0430f1b 100644 --- a/django/db/backends/postgresql/creation.py +++ b/django/db/backends/postgresql/creation.py @@ -1,3 +1,5 @@ +import sys + from django.db.backends.base.creation import BaseDatabaseCreation @@ -11,3 +13,29 @@ class DatabaseCreation(BaseDatabaseCreation): if test_settings['CHARSET']: return "WITH ENCODING '%s'" % test_settings['CHARSET'] return '' + + def _clone_test_db(self, number, verbosity, keepdb=False): + # CREATE DATABASE ... WITH TEMPLATE ... requires closing connections + # to the template database. + self.connection.close() + + qn = self.connection.ops.quote_name + source_database_name = self.connection.settings_dict['NAME'] + target_database_name = self.get_test_db_clone_settings(number)['NAME'] + + with self._nodb_connection.cursor() as cursor: + try: + cursor.execute("CREATE DATABASE %s WITH TEMPLATE %s" % ( + qn(target_database_name), qn(source_database_name))) + except Exception as e: + if keepdb: + return + try: + if verbosity >= 1: + print("Destroying old test database '%s'..." % self.connection.alias) + cursor.execute("DROP DATABASE %s" % qn(target_database_name)) + cursor.execute("CREATE DATABASE %s WITH TEMPLATE %s" % ( + qn(target_database_name), qn(source_database_name))) + except Exception as e: + sys.stderr.write("Got an error cloning the test database: %s\n" % e) + sys.exit(2) |