1 duckdb支持空间查询需要在联网环境下安装DuckDB-Spatial扩展,执行
install spatial
如果服务器没有网络需要下载好 spatial.duckdb_extension文件,然后放置在服务器某个路径下, 通过指定路径方式执行扩展命令:
install /base_path/spatial.duckdb_extension
2 安装完DuckDB-Spatial扩展后还不能直接使用,需要在每次连接数据库时执行:
load spatial
spatial扩展才能生效,因为扩展是不会自动加载的
在springboot工程中,想初始化时安装扩展并且每次创建连接时自动加载spatial扩展,可使用hikariCP的setConnectionInitSql()方法来实现,如下代码仅供参考:
@Bean(name = "duckdbDataSource")
public DataSource duckdbDataSource(
@Qualifier("duckdbHikariConfig") HikariConfig hikariConfig) {
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
try (Connection duckConn = dataSource.getConnection();
Statement stmt = duckConn.createStatement()) {
if (loadExtFileEnable) {
Path configDir = Paths.get("config");
Path targetFile = configDir.resolve("spatial.duckdb_extension");
if (!Files.exists(targetFile)) {
InputStream is = this.getClass().getResourceAsStream("/ext/spatial.duckdb_extension");
if (is == null) {
throw new RuntimeException("Resource not found: /ext/spatial.duckdb_extension");
}
Files.copy(is, targetFile, StandardCopyOption.REPLACE_EXISTING);
}
log.info(String.format("INSTALL '%s'", "./config/spatial.duckdb_extension"));
stmt.execute(String.format("INSTALL '%s'", "./config/spatial.duckdb_extension"));
} else {
stmt.execute("INSTALL spatial");
}
}catch (Exception e){
log.info("load spatial error:{}",e);
}
hikariConfig.setConnectionInitSql("load spatial");
return new HikariDataSource(hikariConfig);
}