gpt4 book ai didi

python - django.core.exceptions.ImproperlyConfigured : SpatiaLite requires SQLite to be configured to allow extension loading

转载 作者:行者123 更新时间:2023-12-03 19:21:48 26 4
gpt4 key购买 nike

我安装了 spatialiteDjango项目,但是当我尝试迁移时,它向我显示此错误:

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.

我不知道如何弄清楚。
我试过 this 通过更改 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 安装了空间,然后我像这样更改了 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'

最佳答案

问题
ImproperlyConfigureddjango.contrib.gis.db.backends.spatialite.base 中引发错误当使用基于默认 sqlite3 库的 Python 构建时 - MacOSX 和可能大多数 Linux 发行版都是这种情况 - 使用扩展加载构建 disabled .所以,这行不通:

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

遵循 GeoDjango 的指示大多数情况下不能解决问题。甚至安装 spatialite-tools通过 Homebrew只在 Homebrew 目录中安装新的空间和 sqlite 可执行文件和库。

解决方案

假设安装了 sqlite 和 spatialite(例如通过 Homebrew)并且各自的 sqlite 版本有 load_extention启用后,您可以使用链接的这个 sqlite 库从头开始构建 Python。使用 pyenv 非常容易。可以通过 PYTHON_CONFIGURE_OPTS 提供特定的构建选项。环境变量(详细信息 here)和设置 CPPFLAGSLDFLAGS (见 here)

使用 pyenv 构建,假设 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 设置中引用动态链接的空间元素很重要(因此请确保 /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 ( see docs ),请从网站下载合并的源文件并按照说明进行操作。您需要包含构建选项 -DSQLITE_ENABLE_RTREE但是 不是 -DSQLITE_OMIT_LOAD_EXTENSION !

编译 sqlite3 后,运行可执行文件并通过命令 .dbconfig 检查
sqlite > .dbconfig
[...]
load_extension on
[...]

加载扩展默认是关闭的,以避免 security issues .

手动构建 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 库的一部分提供,而不是 Python 2 的单独包。以前的解决方案,例如 [pysqlite] 仅适用于 Python2,即 EOL .

您尝试的内容可能基于 older solution ,这可能适用于 Python2。

另外,似乎有人提出了 other solutions for Windows使用 cyqlite

关于python - django.core.exceptions.ImproperlyConfigured : SpatiaLite requires SQLite to be configured to allow extension loading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59157479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com