Power Query调用SQLite访问GPKG时预加载SpatiaLite扩展方法
通过Excel Power Query对存储于GPKG文件、包含geometry列的表执行空间查询时,初始查询语句如下:
= Odbc.Query("database=path/to/gpkg;dsn=SQLite3 Datasource", "select *,st_centroid(geom) as cent from some_layer")
执行后返回错误:
DataSource.Error: ODBC: ERROR [HY000] no such function: st_centroid (1)
该问题在sqlite3命令行(CLI)环境下同样可复现,仅当提前执行select load_extension('mod_spatialite')加载SpatiaLite扩展后,空间函数才可正常运行。
尝试在Power Query中同时写入加载扩展与数据查询两条语句,写法如下:
= Odbc.Query("database=path/to/gpkg;dsn=SQLite3 Datasource", "select load_extension('mod_spatialite');#(lf)select * from some_layer")
执行后触发错误:
DataSource.Error: ODBC: ERROR [HY000] only one SQL statement allowed
需要实现的效果:配置SQLite连接,使其被调用时自动完成SpatiaLite扩展的加载,无需单独执行加载语句。
不需要修改Power Query的SQL执行逻辑,通过连接配置即可实现扩展自动加载,共有两种可行方案:
方案1:连接字符串追加扩展加载参数
SQLite ODBC驱动原生支持连接初始化阶段自动加载指定扩展,直接在连接字符串中添加LoadExt参数指定SpatiaLite扩展即可,无需在SQL查询语句中单独写加载命令,修改后的调用写法如下:= Odbc.Query("database=path/to/gpkg;dsn=SQLite3 Datasource;LoadExt=mod_spatialite", "select *,st_centroid(geom) as cent from some_layer")注意:如果mod_spatialite文件不在系统默认PATH路径下,需要填写文件的完整绝对路径:Windows环境后缀为
.dll,Linux环境后缀为.so,macOS环境后缀为.dylib。方案2:ODBC数据源全局配置自动加载
如果需要多次调用该数据源,不想每次写连接字符串都追加参数,可以直接修改ODBC数据源的默认配置:- 打开与当前Office、SQLite ODBC驱动位数一致的ODBC数据源管理器
- 找到使用的
SQLite3 Datasource项,进入配置页 - 在扩展加载配置栏,填入mod_spatialite的文件路径,勾选连接时自动加载选项
- 保存配置后,所有调用该DSN的连接都会在初始化时自动加载SpatiaLite扩展,直接编写空间查询语句即可正常运行。
两种方案配置完成后,都不会触发单语句限制报错,所有SpatiaLite提供的空间函数均可直接在单条查询中正常调用。
内容的提问来源于stack exchange,提问作者ido klein

