Opened 16 years ago
Closed 16 years ago
#11867 closed (fixed)
if spatialite is installed and pysqlite2.5 is installed without `enable_load_extension` tests won't run
| Reported by: | Daniel Ring | Owned by: | nobody |
|---|---|---|---|
| Component: | GIS | Version: | 1.1 |
| Severity: | Keywords: | enable_load_extension | |
| Cc: | Daniel Ring | Triage Stage: | Unreviewed |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Using spatialite with contrib.gis is supported only with pysqlite2.5.0 or higher, and pysqlite must be compiled with enable_load_extension support (see http://geodjango.org/docs/install.html#pysqlite2 ). If spatialite is present, settings.DATABASE_ENGINE == 'sqlite3', and pysqlite is present but without enable_load_extension support, tests/runtests.py fails as follows:
Traceback (most recent call last):
File "./runtests.py", line 191, in <module>
django_tests(int(options.verbosity), options.interactive, args)
File "./runtests.py", line 161, in django_tests
failures = test_runner(test_labels, verbosity=verbosity, interactive=interactive, extra_tests=extra_tests)
File "/home/dan/work/django/django/django/test/simple.py", line 191, in run_tests
connection.creation.create_test_db(verbosity, autoclobber=not interactive)
File "/home/dan/work/django/django/django/db/backends/creation.py", line 332, in create_test_db
can_rollback = self._rollback_works()
File "/home/dan/work/django/django/django/db/backends/creation.py", line 389, in _rollback_works
cursor = self.connection.cursor()
File "/home/dan/work/django/django/django/db/backends/__init__.py", line 81, in cursor
cursor = self._cursor()
File "/home/dan/work/django/django/django/db/backends/sqlite3/base.py", line 175, in _cursor
connection_created.send(sender=self.__class__)
File "/home/dan/work/django/django/django/dispatch/dispatcher.py", line 166, in send
response = receiver(signal=self, sender=sender, **named)
File "/home/dan/work/django/django/django/contrib/gis/db/backend/spatialite/__init__.py", line 26, in initialize_spatialite
connection.connection.enable_load_extension(True)
AttributeError: 'sqlite3.Connection' object has no attribute 'enable_load_extension'
Note that this is not a test failure, but rather a failure of any tests to run at all.
Also, Debian package python-pysqlite2 (currently) defaults to disabling enable_load_extension. (See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=543252 )
I think either
settings.DATABASE_ENGINE='spatialite'instead of'sqlite3'should be used (my preference) (or maybesqlite3_spatialiteor something); or
contrib.gis.tests.utils.spatialiteshould only be set ifenable_load_extensionis available (contrib.gistests should be skipped somehow).
This was fixed in trunk when multi-db was merged in. In order to support multiple databases, the spatial backends became full-fledged Django database backends. An example configuration:
DATABASES = { 'default' : { 'ENGINE' : 'django.contrib.gis.db.backends.spatialite', 'NAME' : 'geodjango.db', } }Thus, your request for a
spatialitebackend was fulfilled. If still using the oldDATABASE_*settings, thenDATABASE_ENGINE='sqlite3'may still be used but'django.contrib.gis'must also be in yourINSTALLED_APPSto enable backwards-compatibility.Also trunk now has better error-handling in absence of
enable_load_extension. Specifically, thespatialitebackend, upon initialization, now explicitly checks for support and raises a clear error on what went wrong:(from [browser:django/trunk/django/contrib/gis/db/backends/spatialite/base.py])