Python 3中使用Spatialite的Sqlite,并提供对空间索引(即rtree)的完全支持。

3
这是场景:
我正在使用Python 3(在Windows 10上使用Pipenv和vanilla Python的3.6到3.8版本)创建一个具有空间支持和基于空间索引的多个触发器的SQLite文件。
在加载Spatialite后,创建数据库并添加记录很顺利。
  conn.enable_load_extension(True)
  conn.load_extension("mod_spatialite")

然而,使用以下代码添加空间链接
  SELECT CreateSpatialIndex( 'nodes' , 'geometry' );"""

返回以下错误:

updateTableTriggers: "no such module: rtree"

我尝试按照Compiling SQLite RTREE in MSVC?中的建议编译rtree扩展程序,并使用VS 2016 (16.4.2)。但是,在尝试在SQL中加载时,我遇到了各种各样的错误(可能没有正确编译它,但我尝试了多种方法,都没有成功)。我最好的尝试是使用几乎与上面提到的指令相同的成功编译,但是当我尝试...

   p.conn.load_extension("libSqliteRtree.dll")

我遇到了一个问题:

sqlite3.OperationalError: 找不到指定的过程。

我十分疑惑,因为无论我去哪里查找,好像都很少有人讨论这个话题。我脑海中浮现出几个问题:

是否应该使用特定的编译说明/技巧/编译器版本?

是否可以使用标准sqlite3库在Python 3中编译和载入rtree?

这个问题只有在Windows系统下才会出现吗?

是否有其他SQLite Python包可用于此项工作(我没有在PyPI上找到)?

然而,解决方案关键在于它能够适用于不同平台。


你能具体说明一下环境吗?是使用Conda吗?你有一个conda环境,还是一个virtualenv或类似的环境?这通常会有所帮助... - MartinT
Pipenv与原始的Python一起使用。我编辑了问题以添加这一点。 - PCamargo
1个回答

2
我遇到了和你一模一样的问题,使用的是Python 3.8 x64。我认为问题出在Python安装DLLs文件夹内的sqlite3.dll文件没有启用RTREE功能(https://sqlite.org/rtree.html)。
为了解决这个问题,我访问了SQLite网站,下载了适用于Windows x64的最新sqlite3.dll压缩包(希望这个版本已经启用了RTREE功能,因为我尝试自己编译并没有成功),然后将DLLs文件夹中旧的DLL替换为从网站上新下载的DLL。RTREE错误消失了!详细步骤如下:
  1. 访问https://sqlite.org/download.html并选择适用于您系统的“Windows预编译二进制文件”。我的系统是x64,因为我运行的是Python x64。下载.zip并解压缩。

  2. 找到Python的安装文件夹(包含您正在运行的python.exe的文件夹),打开DLLs文件夹。您会看到一个名为sqlite3.dll的文件。这是随Python安装提供的文件。

  3. 从步骤1中解压缩的文件夹中复制sqlite3.dll并粘贴到DLLs文件夹中,单击“是”以替换DLLs文件夹中的文件。这应该解决问题。


这是正确的。实际上我在一段时间后弄清了这个问题,但是忘记发布答案了。我也写了一篇关于这个问题的博客文章。https://xl-optim.com/spatialite-and-python-in-2020/ - PCamargo

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