python写sqlite Spatial

啊...SQLite 加上 SpatiaLite...这个东西...我在 2 02 2 年会很难做到。

首先...你必须安装库...这是必要的。
在终端中输入命令... pip install pysqlite3 这是基本库。
对于Linux系统...你必须安装开发包... sudo apt-get 更新 sudo apt-get install libsqlite3 -dev libspatialite-dev 这一步...有时会安装失败...这取决于系统...您可能需要尝试几次。

安装后...编写Python代码... 蟒蛇 import sqlite3
连接到数据库...给它一个名称...例如,my_spatial.db。
蟒蛇 conn = sqlite3 .connect('my_spatial.db')
那么关键的一步来了...你必须启用扩展加载功能。
蟒蛇 conn.enable_load_extension(True)
在此步骤之后...您必须加载 SpatiaLite 扩展... 注意路径.../usr/lib/x8 6 _6 4 -linux-gnu/mod_spatialite。
这条路可能会有所不同......你必须找到它...... 蟒蛇 conn.load_extension('/usr/lib/x8 6 _6 4 -linux-gnu/mod_spatialite')
加载后...您必须确认... 蟒蛇 光标 = conn.cursor() cursor.execute("SELECT load_extension('mod_spatialite');")
如果没有报错...说明加载成功。

然后创建表...存储点坐标... 蟒蛇 光标.执行(''' 如果不存在则创建表位置( id 整数主键, 名称文本, 位置点 ); ''')
创建空间索引...这很重要...查询很快... 蟒蛇 cursor.execute('SELECT CreateSpatialIndex("places", "location");')
然后插入数据...使用 WKT 格式... 蟒蛇 光标.执行(''' INSERT INTO 地点(名称、位置)VALUES (?, GeomFromText(?, 4 3 2 6 )); ''', ('Location1 ', 'POINT(3 0.2 6 7 2 -9 7 .7 4 3 1 )'))
这个坐标是奥斯汀...3 0.2 6 7 2 ,-9 7 .7 4 3 1 ...我在2 02 2 年测量的。

然后保存... 蟒蛇 conn.commit()
查询...例如,查找多边形中的一个点... 蟒蛇 光标.执行(''' 从地点中选择 id、名称、AsText(位置) WHERE ST_Within(位置, GeomFromText('多边形((3 0.0 -9 8 .0, 3 0.5 -9 8 .0, 3 0.5 -9 7 .5 , 3 0.0 -9 7 .5 , 3 0.0 -9 8 .0))', 4 3 2 6 )); ''') 行=游标.fetchall() 对于行中的行: print(row)
将打印结果...看看是否有。

最后别忘了关闭连接... 蟒蛇 conn.close()
注意几点... 路径...在Linux上,通常是/usr/lib/x8 6 _6 4 -linux-gnu/mod_spatialite...但并非所有系统都相同...在macOS上,可能是/usr/local/lib/mod_spatialite.dylib...在Windows上,你必须找到DLL文件...从官网下载...然后指定路径。

函数... SpatiaLite函数有很多...ST_Within、ST_Distance...都要用GeomFromText转WKT...
库安装没做好...或者路径错误...加载扩展会失败...必须检查...是否libspatialite-dev没有安装...或者路径错误...
数据量大时...必须建索引...CreateSpatialIndex...速度慢 构建...构建速度很快...
就是这样...

解决 Python sqlite3 游标无法接收 kwargs 的问题

说白了,解决Python sqlite3 游标无法接收kwargs的问题其实很简单。
这意味着自定义连接工厂。
具体来说,它继承了 sqlite3 .Connection 类,重写了游标方法,并忽略了额外的 kwargs 参数。

首先,最重要的是你需要重写自定义连接类中的cursor方法,使其只接收args而忽略kwargs。
例如,在我去年运行的一个项目中,我创建了一个 TestConnect 类,该类继承了 sqlite3 .Connection 并重写了游标方法以接受所有参数,但仅将参数传递给父类的游标方法。

另一件事是我们需要指定这个自定义工厂。
调用 sqlite3 .connect() 时,通过工厂参数传递您的自定义类。
例如,使用“:memory:”作为数据库文件路径,然后将其传递给 TestConnect 类。

一开始我以为直接修改sqlite3 .Cursor就可以解决问题,后来发现问题是因为conn.cursor()没有使用被取代的类。
等一下。
如果需要基于 kwargs 自定义游标行为,例如动态设置 row_factory,则可以向自定义游标方法添加逻辑。

最后,我想提醒您一个具有全球影响的简单陷阱。
通过此连接创建的任何游标都将忽略任何其他 kwargs,因此您应该验证此忽略行为是否符合您的预期。

我认为这可能值得一试,特别是当您需要在测试中传递非标准参数(例如模拟 row_factory)时。
然而,在实际应用中,您可能需要根据您的需求决定是忽略所有 kwargs 还是添加条件处理逻辑。