DuckDB:Golang操作DuckDB实践指南
DuckDB Go驱动程序Go-DuckDB允许通过
database/sql
接口使用DuckDB。有关如何使用此接口的示例,请参阅官方文档和教程。Go-DuckDB项目,托管于https://github.com/marcboeker/go-duckdb,是官方的DuckDB Go客户端。本文解释Go操作DuckDB,并结合基本示例和批量追加示例进行说明。
环境准备
安装
go-duckdb客户端安装,可以执行下面命令:
go get github.com/marcboeker/go-duckdb
导入包
要导入DuckDB Go包,请在导入中添加以下条目:
import (
"database/sql"
_ "github.com/marcboeker/go-duckdb"
)
基本操作示例
使用Go API的示例如下:
package main
import (
"database/sql"
"errors"
"fmt"
"log"
_ "github.com/marcboeker/go-duckdb"
)
func main() {
db, err := sql.Open("duckdb", "")
if err != nil {
log.Fatal(err)
}
defer db.Close()
_, err = db.Exec(`CREATE TABLE people (id INTEGER, name VARCHAR)`)
if err != nil {
log.Fatal(err)
}
_, err = db.Exec(`INSERT INTO people VALUES (42, 'John')`)
if err != nil {
log.Fatal(err)
}
var (
id int
name string
)
row := db.QueryRow(`SELECT id, name FROM people`)
err = row.Scan(&id, &name)
if errors.Is(err, sql.ErrNoRows) {
log.Println("no rows")
} else if err != nil {
log.Fatal(err)
}
fmt.Printf("id: %d, name: %s\n", id, name)
}
Appender操作示例
Appender可用于将批量数据加载到DuckDB数据库中。Appender绑定到一个连接,并在追加时使用该连接的事务上下文。Appender总是对数据库文件中的单个表进行追加。
默认情况下,appender每204,800行执行一次提交。您可以通过显式地使用事务并通过BEGIN TRANSACTION和COMMITstatements包围AppendRow调用批次来改变这一点。
如果Appender遇到PRIMARY KEY冲突或UNIQUE约束违反,则失败并返回以下错误:
Constraint Error: PRIMARY KEY or UNIQUE constraint violated: duplicate key "..."
在这种情况下,整个追加操作失败,没有插入任何行。
下面是Appender操作示例,DuckDB Go客户端支持用于批量插入的DuckDB Appender API。你可以通过向NewAppenderFromConn() 提供DuckDB连接来获得新的Appender。例如:
connector, err := duckdb.NewConnector("test.db", nil)
if err != nil {
...
}
conn, err := connector.Connect(context.Background())
if err != nil {
...
}
defer conn.Close()
// Retrieve appender from connection (note that you have to create the table 'test' beforehand).
appender, err := NewAppenderFromConn(conn, "", "test")
if err != nil {
...
}
defer appender.Close()
err = appender.AppendRow(...)
if err != nil {
...
}
// Optional, if you want to access the appended rows immediately.
err = appender.Flush()
if err != nil {
...
}