DuckDB是一个嵌入式SQL数据库引擎。它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的。DuckDB支持各种数据类型和SQL特性。凭借其在以内存为中心的环境中处理高速分析的能力,它迅速受到数据科学家和分析师的欢迎。在这篇博文中,我们将探索在Go中使用DuckDB。
DuckDB的主要优点
- 内存内执行:DuckDB主要在内存中操作,但也支持内存外执行。这使得它能够非常快速有效地执行计算。
- 完整的SQL支持:DuckDB支持广泛的SQL特性,这使得它对于各种类型的数据操作非常灵活。
- 事务支持:DuckDB支持事务,这是在许多应用程序中维护数据完整性和一致性的关键特性。
- 向量化执行:DuckDB使用向量化查询执行,从而提高CPU利用率和性能。
- 易于集成:DuckDB为多种编程语言提供api,包括Python、R、c++、Rust、Java和Go。这使得将DuckDB集成到现有工作流和系统中变得更加容易。
- 开源:DuckDB是开源的,这意味着它的源代码可以免费修改或增强。这允许社区驱动的改进和对特定用例的适应性。
环境准备
在开始使用DuckDB和Go之前,需要安装DuckDB Go驱动程序。你可以使用Go的包管理器下载。在终端上运行以下命令:
github.com/marcboeker/go-duckdb
- 连接数据库
package main
import (
"database/sql"
"log"
_ "github.com/marcboeker/go-duckdb"
)
func main() {
// Empty datasource means, that DB will be solely in-memory, otherwise you could specify a filename here
db, err := sql.Open("duckdb", "")
if err != nil {
log.Fatal("Failed to connect to database:", err)
}
defer db.Close()
}
安装了驱动程序后,现在可以从Go应用程序建立到DuckDB的连接。sql.Open() 函数用于连接到DuckDB,空数据源名称表示我们正在使用内存中的数据库,你也可以指定数据库文件名称,实现数据持久化,相对于当前项目所在目录。
初始化表和数据
现在连接已经建立,你可以执行各种数据库操作了。我们首先创建表,然后插入初始化数据进行测试:
package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/marcboeker/go-duckdb"
)
var db *sql.DB
var err error
func main() {
// Empty datasource means, that DB will be solely in-memory, otherwise you could specify a filename here
db, err = sql.Open("duckdb", "data.db")
if err != nil {
log.Fatal("Failed to connect to database:", err)
}
defer db.Close()
init_data()
}
func init_data() {
// Create table
_, err := db.Exec(`
CREATE TABLE employee (
id INTEGER,
name VARCHAR(20),
start_dt TIMESTAMP,
is_remote BOOLEAN
)`)
if err != nil {
log.Fatal(err)
}
// Insert some data in table
_, err = db.Exec(&