diff options
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/gis/db/backends/spatialite/creation.py | 102 | ||||
| -rw-r--r-- | django/contrib/gis/db/backends/spatialite/operations.py | 25 | ||||
| -rw-r--r-- | django/db/backends/creation.py | 8 |
3 files changed, 15 insertions, 120 deletions
diff --git a/django/contrib/gis/db/backends/spatialite/creation.py b/django/contrib/gis/db/backends/spatialite/creation.py index ebed0cad5c..1592ae50b9 100644 --- a/django/contrib/gis/db/backends/spatialite/creation.py +++ b/django/contrib/gis/db/backends/spatialite/creation.py @@ -1,76 +1,8 @@ -import os - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured from django.db.backends.sqlite3.creation import DatabaseCreation class SpatiaLiteCreation(DatabaseCreation): - def create_test_db(self, verbosity=1, autoclobber=False, serialize=True, keepdb=False): - """ - Creates a test database, prompting the user for confirmation if the - database already exists. Returns the name of the test database created. - - This method is overloaded to load up the SpatiaLite initialization - SQL prior to calling the `migrate` command. - """ - # Don't import django.core.management if it isn't needed. - from django.core.management import call_command - - test_database_name = self._get_test_db_name() - - if verbosity >= 1: - test_db_repr = '' - action = 'Creating' - if verbosity >= 2: - test_db_repr = " ('%s')" % test_database_name - if keepdb: - action = 'Using existing' - print("%s test database for alias '%s'%s..." % ( - action, self.connection.alias, test_db_repr)) - - self._create_test_db(verbosity, autoclobber, keepdb) - - self.connection.close() - self.connection.settings_dict["NAME"] = test_database_name - - # Need to load the SpatiaLite initialization SQL before running `migrate`. - self.load_spatialite_sql() - - # Report migrate messages at one level lower than that requested. - # This ensures we don't get flooded with messages during testing - # (unless you really ask to be flooded) - call_command('migrate', - verbosity=max(verbosity - 1, 0), - interactive=False, - database=self.connection.alias, - load_initial_data=False) - - # We then serialize the current state of the database into a string - # and store it on the connection. This slightly horrific process is so people - # who are testing on databases without transactions or who are using - # a TransactionTestCase still get a clean database on every test run. - if serialize: - self.connection._test_serialized_contents = self.serialize_db_to_string() - - # We need to then do a flush to ensure that any data installed by - # custom SQL has been removed. The only test data should come from - # test fixtures, or autogenerated from post_migrate triggers. - # This has the side effect of loading initial data (which was - # intentionally skipped in the migrate). - call_command('flush', - verbosity=max(verbosity - 1, 0), - interactive=False, - database=self.connection.alias) - - call_command('createcachetable', database=self.connection.alias) - - # Ensure a connection for the side effect of initializing the test database. - self.connection.ensure_connection() - - return test_database_name - def sql_indexes_for_field(self, model, f, style): "Return any spatial index creation SQL for the field." from django.contrib.gis.db.models.fields import GeometryField @@ -99,35 +31,9 @@ class SpatiaLiteCreation(DatabaseCreation): return output - def load_spatialite_sql(self): + def _create_test_db_pre_migrate_sql(self): """ - This routine loads up the SpatiaLite SQL file. + Creates the spatial metadata tables. """ - if self.connection.ops.spatial_version[:2] >= (2, 4): - # Spatialite >= 2.4 -- No need to load any SQL file, calling - # InitSpatialMetaData() transparently creates the spatial metadata - # tables - cur = self.connection._cursor() - cur.execute("SELECT InitSpatialMetaData()") - else: - # Spatialite < 2.4 -- Load the initial SQL - - # Getting the location of the SpatiaLite SQL file, and confirming - # it exists. - spatialite_sql = self.spatialite_init_file() - if not os.path.isfile(spatialite_sql): - raise ImproperlyConfigured('Could not find the required SpatiaLite initialization ' - 'SQL file (necessary for testing): %s' % spatialite_sql) - - # Opening up the SpatiaLite SQL initialization file and executing - # as a script. - with open(spatialite_sql, 'r') as sql_fh: - cur = self.connection._cursor() - cur.executescript(sql_fh.read()) - - def spatialite_init_file(self): - # SPATIALITE_SQL may be placed in settings to tell GeoDjango - # to use a specific path to the SpatiaLite initialization SQL. - return getattr(settings, 'SPATIALITE_SQL', - 'init_spatialite-%s.%s.sql' % - self.connection.ops.spatial_version[:2]) + cur = self.connection._cursor() + cur.execute("SELECT InitSpatialMetaData()") diff --git a/django/contrib/gis/db/backends/spatialite/operations.py b/django/contrib/gis/db/backends/spatialite/operations.py index f07d654531..7064912413 100644 --- a/django/contrib/gis/db/backends/spatialite/operations.py +++ b/django/contrib/gis/db/backends/spatialite/operations.py @@ -140,17 +140,15 @@ class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations): 'database (error was "%s"). Was the SpatiaLite initialization ' 'SQL loaded on this database?') % (self.connection.settings_dict['NAME'], msg) six.reraise(ImproperlyConfigured, ImproperlyConfigured(new_msg), sys.exc_info()[2]) - if version < (2, 3, 0): + if version < (2, 4, 0): raise ImproperlyConfigured('GeoDjango only supports SpatiaLite versions ' - '2.3.0 and above') + '2.4.0 and above') return version @property def _version_greater_2_4_0_rc4(self): if self.spatial_version >= (2, 4, 1): return True - elif self.spatial_version < (2, 4, 0): - return False else: # Spatialite 2.4.0-RC4 added AsGML and AsKML, however both # RC2 (shipped in popular Debian/Ubuntu packages) and RC4 @@ -274,24 +272,7 @@ class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations): Returns the SpatiaLite version as a tuple (version string, major, minor, subminor). """ - # Getting the SpatiaLite version. - try: - version = self.spatialite_version() - except DatabaseError: - # The `spatialite_version` function first appeared in version 2.3.1 - # of SpatiaLite, so doing a fallback test for 2.3.0 (which is - # used by popular Debian/Ubuntu packages). - version = None - try: - tmp = self._get_spatialite_func("X(GeomFromText('POINT(1 1)'))") - if tmp == 1.0: - version = '2.3.0' - except DatabaseError: - pass - # If no version string defined, then just re-raise the original - # exception. - if version is None: - raise + version = self.spatialite_version() m = self.version_regex.match(version) if m: diff --git a/django/db/backends/creation.py b/django/db/backends/creation.py index 1622f0c472..0b40244924 100644 --- a/django/db/backends/creation.py +++ b/django/db/backends/creation.py @@ -369,6 +369,8 @@ class BaseDatabaseCreation(object): settings.DATABASES[self.connection.alias]["NAME"] = test_database_name self.connection.settings_dict["NAME"] = test_database_name + self._create_test_db_pre_migrate_sql() + # We report migrate messages at one level lower than that requested. # This ensures we don't get flooded with messages during testing # (unless you really ask to be flooded). @@ -402,6 +404,12 @@ class BaseDatabaseCreation(object): return test_database_name + def _create_test_db_pre_migrate_sql(self): + """ + Hook for databases to load SQL before creating the test DB. + """ + pass + def serialize_db_to_string(self): """ Serializes all data in the database into a JSON string. |
