Django核心异常.ImproperlyConfigured: SpatiaLite需要配置SQLite以允许加载扩展。

5

我为我的Django项目安装了Spatialite,但是当我尝试进行迁移时,出现了以下错误:

File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/django/contrib/gis/db/backends/spatialite/base.py", line 44, in get_new_connection
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: SpatiaLite requires SQLite to be configured to allow extension loading.

我不知道如何解决。

我尝试通过更改libexec/setuptools/setup.cfg文件这个

[build_ext]
 #define=
include_dirs=/Library/Frameworks/SQLite3.framework/unix/include
library_dirs=/Library/Frameworks/SQLite3.framework/unix/lib
libraries=sqlite3
#define=SQLITE_OMIT_LOAD_EXTENSION

我已经通过brew安装了spatialite,然后我像这样更改了settings.py:

DATABASES = {
 'default': {
    'ENGINE': 'django.contrib.gis.db.backends.spatialite',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 }
}
SPATIALITE_LIBRARY_PATH='/usr/local/lib/mod_spatialite.dylib'

看起来是配置不当。请检查文档:https://docs.djangoproject.com/en/2.2/ref/contrib/gis/install/spatialite/ - Tamoor Salah-U-Din
我已经尝试过了,但对我来说都没有用。 - emale sdm
1个回答

5

问题

ImproperlyConfigured 错误会在使用基于默认 sqlite3 库的 Python 构建时发生,这是 MacOSX 和大多数 Linux 发行版的情况。该错误在 django.contrib.gis.db.backends.spatialite.base 中引发,因为默认 sqlite3 库被构建成禁用扩展加载(disabled)。因此,以下操作将无法运行:

conn.enable_load_extension(True)
conn.load_extension(SPATIALITE_LIBRARY_PATH)

遵循 GeoDjango 的指示通常无法解决大多数问题。即使通过 Homebrew 安装了 spatialite-tools,也只会在 Homebrew 目录中安装新的 spatialite 和 sqlite 可执行文件和库。

解决方案

假设已安装了 sqlite 和 spatialite(例如通过 Homebrew 安装),并且相应的 sqlite 版本启用了 load_extention,则可以使用此链接的 sqlite 库从头开始构建 Python。使用 pyenv 非常容易。可以通过 PYTHON_CONFIGURE_OPTS 环境变量提供特定的构建选项(详情请参见 这里),并设置 CPPFLAGSLDFLAGS(请参见 这里)。

使用 pyenv 进行构建,假设通过 homebrew 安装了 sqlite(检查 which sqlite3brew info sqlite 以获取有关已安装版本和位置的详细信息):

PYTHON_CONFIGURE_OPTS="--enable-loadable-sqlite-extensions --enable-optimizations --with-openssl=\$(brew --prefix openssl)" \
LDFLAGS="-L/usr/local/opt/sqlite/lib" \
CPPFLAGS="-I/usr/local/opt/sqlite/include" \
pyenv install 3.8.2

如果缺少依赖项(例如openssl),请参见下面有关手动构建Python的说明。
最后,重要的是在Django设置中引用动态链接的spatialite(因此请确保/usr/local/lib/mod_spatialite.dylib存在)。
SPATIALITE_LIBRARY_PATH = '/usr/local/lib/mod_spatialite.dylib'
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.spatialite',
        'NAME': os.path.join(BASE_DIR, 'db.spatialite3'),
    }
}

手动构建SQLite和Python

要从源代码编译启用加载扩展的SQLite(查看文档),请从网站下载聚合源文件并按照说明进行操作。您需要包含构建选项-DSQLITE_ENABLE_RTREE但不要使用-DSQLITE_OMIT_LOAD_EXTENSION

一旦编译了sqlite3,请运行可执行文件并通过命令.dbconfig检查其状态。

sqlite > .dbconfig
[...]
load_extension on
[...]

默认情况下,不加载扩展程序以避免安全问题。手动构建Python也非常简单,遵循与通过pyenv安装类似的模式。一旦满足了依赖关系(例如在macos上,使用“brew install openssl xz gdbm”),您可以下载所需版本的tarball并设置编译选项以启用SQLite扩展程序加载(并告诉make在哪里找到新编译的SQLite构建)。
./configure --enable-loadable-sqlite-extensions --enable-optimizations --with-openssl=$(brew --prefix openssl)
LDFLAGS="-L<path-to-sqlite>" \
CPPFLAGS="-I<path-to-sqlite>" \
make -j2

其他解决方案(和其他系统)

所述解决方案主要适用于MacOS和Python3,因为sqlite3作为Python3标准库的一部分而被安装,而不是Python 2的一个单独的包。以前的解决方案,例如[pysqlite]仅适用于Python2,已经停更

您尝试的内容可能基于旧的解决方案,可能适用于Python2。

此外,还有提议使用 cyqlite其他Windows解决方案.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接