当前位置: 首页 > article >正文

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 {
  ...
}

http://www.kler.cn/a/512949.html

相关文章:

  • 一文了解如何在Qt中间集成Halcon窗口并在子线程显示(附工程源码下载链接)
  • 数据结构——栈
  • 【AI | pytorch】torch.polar的使用
  • Linux 高级路由与流量控制-用 tc qdisc 管理 Linux 网络带宽
  • MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互
  • boss直聘 __zp_stoken__ 分析
  • 20250120面试鸭特训营第28天
  • 计算机网络 (48)P2P应用
  • feign调用跳过HTTPS的SSL证书校验配置详解
  • Android 右键后无Java class创建
  • 2024:在成长、创作与生活中找到星光
  • SSM宠物医院信息管理系统
  • C# 的 NLog 库高级进阶
  • PyTorch框架——基于深度学习YOLOv8神经网络学生课堂行为检测识别系统
  • TaskBuilder前后端通讯的数据格式
  • 扬帆数据结构算法之舟,启航C++探索征途——LeetCode深度磨砺:顺序表技术精进实践
  • 持续集成工具Jenkins(一)
  • 服务器机房迁移,centos系统root无法登录,也无法联网等问题
  • Pandas 数据分析(二)【股票数据】
  • Windows7搭建Hadoop-2.7.3源码阅读环境问题解决列表
  • Maven私服-Nexus3安装与使用
  • Android SystemUI——自定义状态栏和导航栏(十二)
  • 特朗普:加密货币列为国家优先事项
  • Visual Studio 2022中文软件下载安装过程
  • DNS DDoS攻击是怎么回事?怎么预防?
  • 【网络原理】万字详解 HTTP 协议