我在使用
enable_load_extension()
时出现以下错误:
AttributeError:'sqlite3.Connection'对象没有属性'enable_load_extension'
我也看到了this,但是sqlite3应该是Python自带的。如何使用正确的选项重新安装它?
默认情况下,sqlite3 模块未构建可加载扩展支持,因为某些平台(特别是 Mac OS X)具有在编译时没有此功能的 SQLite 库。要获得可加载扩展支持,您必须通过 –enable-loadable-sqlite-extensions 进行配置。
检查您的 sqlite3 是否是在启用扩展加载的情况下构建的。您可以通过运行可执行文件进行检查并通过命令
.dbconfig
进行检查
$ sqlite3
SQLite version ...
...
sqlite> .dbconfig
...
load_extension on
如果不是这种情况,请通过 Homebrew 安装 sqlite 或从源代码编译请参阅文档。
然后,您想要从头开始构建 Python,并链接适当的 sqlite3 库。使用 pyenv 非常简单。可以通过
PYTHON_CONFIGURE_OPTS
环境变量(详细信息此处)和设置 CPPFLAGS
和 LDFLAGS
(参见此处) 提供特定的构建选项
使用 pyenv 进行构建,假设 sqlite3 是通过 Homebrew 安装的(检查
which sqlite3
和 brew 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
您可能还需要满足 Python3 的一些依赖关系(例如在 macos
brew install openssl xz gdbm
)
手动构建 Python 也非常简单,并且遵循类似的模式。满足依赖关系后,下载所需版本的 tarball 并设置编译选项以启用 sqlite3 扩展加载(并告诉 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
如果您的 Python
sqlite3
模块不支持加载扩展,您可以使用 sqlean.py
包来修复此问题。
它是标准库的
sqlite3
模块的直接替代品,已经针对 Windows、Linux 和 macOS 进行了预编译,因此您无需编译任何内容。
pip install sqlean.py
import sqlean as sqlite3
# has the same API as the default `sqlite3` module
conn = sqlite3.connect(":memory:")
conn.execute("create table employees(id, name)")
conn.close()
您需要找到安装Python的文件夹并重新安装它。
第 1 步:跟踪您当前的配置
import sysconfig
sysconfig.get_config_vars('CONFIG_ARGS')[0]
第 2 步:重新安装(从 python 文件夹内!)
Python-3.X $ ./configure --with-pydebug \ # for example & add your previous configuration
--enable-loadable-sqlite-extensions # <-
Python-3.X $ make -s -j2 # amount of processors
Python-3.X $ sudo make altinstall # doesn't overwrite previous installations
第3步:再次检查第1步的配置
Python-3.X $ ./python # check the prompt
>>> import sysconfig # etc
第四步:更新路径、环境变量等
有关处理器数量和
altinstall
的更多信息,只需在上面的开发指南的链接中查找ex即可,这不是强制性的,仅取决于您的个人需求。
在 sqlite3 文档中,您可以找到
enable_load_extension
的工作示例。
我使用 pyenv 而不是 macos,这对我有用。
$ brew install sqlite3
$ PYTHON_CONFIGURE_OPTS="--enable-loadable-sqlite-extensions" \
LDFLAGS="-L/opt/homebrew/opt/sqlite/lib" \
CPPFLAGS="-I/opt/homebrew/opt/sqlite/include" \
pyenv install <PYTHON_VERSION>
来源:https://github.com/pyenv/pyenv/issues/1702#issuecomment-1818499967