首页 > 其他分享 >go操作duckdb

go操作duckdb

时间:2024-06-17 11:25:29浏览次数:9  
标签:Background err DuckDB db duckdb context go 操作 check

什么是duckdb

DuckDB是一个开源的嵌入式SQL数据库管理系统。与传统的SQL数据库不同,DuckDB不需要一个服务器进程,
也不需要在系统上安装数据库软件。它被设计为轻量级和高性能,可以轻松嵌入到应用程序中,提供完整的SQL数据库功能。
以下是DuckDB的一些关键特性:

1. **轻量级**:DuckDB的二进制文件非常小,通常只有几百KB,这使得它非常适合嵌入式使用。

2. **高性能**:DuckDB利用现代硬件优化查询性能,支持索引、物化视图、查询优化等特性。

3. **标准SQL支持**:DuckDB遵循SQL标准,支持大多数SQL数据类型、函数和操作。

4. **跨平台**:DuckDB可以在多种操作系统上运行,包括Windows、macOS、Linux等。

5. **多种数据源**:DuckDB支持从CSV、Parquet、SQLite等不同数据源导入数据。

6. **并发控制**:DuckDB支持多线程查询,可以在多核处理器上并行执行。

7. **事务支持**:DuckDB支持ACID事务,确保数据的一致性和完整性。

8. **API支持**:DuckDB提供了多种编程语言的API,包括C、Python、R等,方便集成。

9. **无服务器模式**:DuckDB可以在无服务器环境中运行,适合云原生和容器化应用。

10. **可扩展性**:DuckDB允许用户通过扩展添加新的功能,如自定义函数、聚合函数等。

DuckDB适用于需要轻量级数据库解决方案的场景,如数据分析、数据科学、机器学习、嵌入式系统、Web应用等。
由于其轻量级和高性能的特点,DuckDB也适合作为教学和学习SQL的工具。

go操作库地址为 https://github.com/marcboeker/go-duckdb

main.go

package main

import (
	"context"
	"database/sql"
	"log"
	"time"

	_ "github.com/marcboeker/go-duckdb"
)

var db *sql.DB

type user struct {
	name    string
	age     int
	height  float32
	awesome bool
	bday    time.Time
}

func main() {
	var err error

	db, err = sql.Open("duckdb", "?access_mode=READ_WRITE") //设置读写权限

	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	check(db.Ping())

	setting := db.QueryRowContext(context.Background(), "SELECT current_setting('access_mode')")
	var am string
	check(setting.Scan(&am))
	log.Printf("DB opened with access mode %s", am)
    //普通操作,建表,插入数据 
	check(db.ExecContext(context.Background(), "CREATE TABLE users(name VARCHAR, age INTEGER, height FLOAT, awesome BOOLEAN, bday DATE)"))
	check(db.ExecContext(context.Background(), "INSERT INTO users VALUES('marc', 99, 1.91, true, '1970-01-01')"))
	check(db.ExecContext(context.Background(), "INSERT INTO users VALUES('macgyver', 70, 1.85, true, '1951-01-23')"))
    //查询
	rows, err := db.QueryContext(
		context.Background(), `
		SELECT name, age, height, awesome, bday
		FROM users
		WHERE (name = ? OR name = ?) AND age > ? AND awesome = ?`,
		"macgyver", "marc", 30, true,
	)
	check(err)
	defer rows.Close()
    //遍历打印
	for rows.Next() {
		u := new(user)
		err := rows.Scan(&u.name, &u.age, &u.height, &u.awesome, &u.bday)
		if err != nil {
			log.Fatal(err)
		}
		log.Printf(
			"%s is %d years old, %.2f tall, bday on %s and has awesomeness: %t\n",
			u.name, u.age, u.height, u.bday.Format(time.RFC3339), u.awesome,
		)
	}
	check(rows.Err())
    //删除
	res, err := db.ExecContext(context.Background(), "DELETE FROM users")
	check(err)

	ra, _ := res.RowsAffected()
	log.Printf("Deleted %d rows\n", ra)
    //事务
	runTransaction()
    //预操作
	testPreparedStmt()
}

func check(args ...interface{}) {
	err := args[len(args)-1]
	if err != nil {
		panic(err)
	}
}

func runTransaction() {
	log.Println("Starting transaction...")
	tx, err := db.Begin()
	check(err)

	check(
		tx.ExecContext(
			context.Background(),
			"INSERT INTO users VALUES('gru', 25, 1.35, false, '1996-04-03')",
		),
	)
	row := tx.QueryRowContext(context.Background(), "SELECT COUNT(*) FROM users WHERE name = ?", "gru")
	var count int64
	check(row.Scan(&count))
	if count > 0 {
		log.Println("User Gru was inserted")
	}

	log.Println("Rolling back transaction...")
	check(tx.Rollback())

	row = db.QueryRowContext(context.Background(), "SELECT COUNT(*) FROM users WHERE name = ?", "gru")
	check(row.Scan(&count))
	if count > 0 {
		log.Println("Found user Gru")
	} else {
		log.Println("Couldn't find user Gru")
	}
}

func testPreparedStmt() {
	stmt, err := db.PrepareContext(context.Background(), "INSERT INTO users VALUES(?, ?, ?, ?, ?)")
	check(err)
	defer stmt.Close()

	check(stmt.ExecContext(context.Background(), "Kevin", 11, 0.55, true, "2013-07-06"))
	check(stmt.ExecContext(context.Background(), "Bob", 12, 0.73, true, "2012-11-04"))
	check(stmt.ExecContext(context.Background(), "Stuart", 13, 0.66, true, "2014-02-12"))

	stmt, err = db.PrepareContext(context.Background(), "SELECT * FROM users WHERE age > ?")
	check(err)

	rows, err := stmt.QueryContext(context.Background(), 1)
	check(err)
	defer rows.Close()

	for rows.Next() {
		u := new(user)
		err := rows.Scan(&u.name, &u.age, &u.height, &u.awesome, &u.bday)
		if err != nil {
			log.Fatal(err)
		}
		log.Printf(
			"%s is %d years old, %.2f tall, bday on %s and has awesomeness: %t\n",
			u.name, u.age, u.height, u.bday.Format(time.RFC3339), u.awesome,
		)
	}
}

输出

2024/06/17 10:59:30 DB opened with access mode read_write
2024/06/17 10:59:30 marc is 99 years old, 1.91 tall, bday on 1970-01-01T00:00:00Z and has awesomeness: true
2024/06/17 10:59:30 macgyver is 70 years old, 1.85 tall, bday on 1951-01-23T00:00:00Z and has awesomeness: true
2024/06/17 10:59:30 Deleted 2 rows
2024/06/17 10:59:30 Starting transaction...
2024/06/17 10:59:30 User Gru was inserted
2024/06/17 10:59:30 Rolling back transaction...
2024/06/17 10:59:30 Couldn't find user Gru
2024/06/17 10:59:30 Kevin is 11 years old, 0.55 tall, bday on 2013-07-06T00:00:00Z and has awesomeness: true
2024/06/17 10:59:30 Bob is 12 years old, 0.73 tall, bday on 2012-11-04T00:00:00Z and has awesomeness: true
2024/06/17 10:59:30 Stuart is 13 years old, 0.66 tall, bday on 2014-02-12T00:00:00Z and has awesomeness: true

标签:Background,err,DuckDB,db,duckdb,context,go,操作,check
From: https://www.cnblogs.com/qcy-blog/p/18251995

相关文章

  • go语言之异步并发
    1.首先讲一下匿名函数和闭包的概念,(仔细看,其实Python代码里很好看,只不过Go语言代码有点多,看起来很复杂的感觉)packagemainimport"fmt"funcmain(){/*注意:匿名函数和闭包往往是一起出现的*///不带参的匿名函数func(){fmt.Printf("不带参数的匿名......
  • Go 语言中值接收者和指针接收者方法调用的自动转换规则详解
    在Go语言中,方法的调用规则对于值接收者和指针接收者有一些特别的行为,这使得代码变得更加简洁和易用。我们来详细解释一下“方法值调用规则”和“方法表达式调用规则”,以及它们如何影响代码的行为。方法值调用(MethodValueCall)在Go中,方法调用的语法是receiver.method().当......
  • Mongodb UPDATE, 使用$position指定向数组中插入新元素的位置
    学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第72篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。本篇文章,我们聊聊在mongodb数组更新的操作符$po......
  • 领导让前端实习生在网页上添加一个长时间不操作锁定电脑的功能
    接上文:屠龙少年终成恶龙,前端转产品的我给前端挖了个坑前情提要大约一个月前,公司的医疗管理系统终于完工上线。后面一个周一,领导叫大家开会,说后面没有项目进来了,用不了这么多开发人员,原地宣布裁员。再后一周后,花2000招了个实习生,工作内容为系统维护。工作内容领导:由于我们工......
  • 京准电钟 | GPS北斗卫星授时服务器的操作指南是什么?
    京准电钟|GPS北斗卫星授时服务器的操作指南是什么?京准电钟|GPS北斗卫星授时服务器的操作指南是什么?京准电子科技官微——ahjzsz1、连接天线天线连接到“ANT”口。2、连接电源将220V电源线连到AC220V座上或将电源适配器(7.5V~12V)接到DC口上。也可以同时接上,提高供电可靠......
  • NumPy元素操作
    NumPy元素操作NumPy对元素的操作一般为增删改查和切片5种。1.增np.append(arr,value,axis=n)#arr:要操作的数组#value:要增加的值#axis:操作的维度(1)一维数组importnumpyasnp#添加数据,一维数组无需指定axisarr=np.array([1,2,3,4])#添加一个数据arr1......
  • PHP 程序员转 Go 语言的经历分享
    大家好,我是码农先森。之前有朋友让我分享从PHP转Go的经历,这次它来了。我主要从模仿、进阶、应用这三个方面来描述转Go的经历及心得。模仿是良好的开端,进阶是艰难的成长,应用是认知的提升。希望我的经历对大家能有所启发。模仿著名艺术家毕加索说过「模仿是人类一切学习的......
  • 解读supOS工业操作系统的三个层级
    工业操作系统作为工业企业全面数字化转型和政府数字经济改革的核心引擎与底座,为工厂内人机料协同、工厂间供应链协同、行业指数发展研究、产业链能力提升研究等方面提供基础性平台与工具赋能。工业操作系统的具体形态,按服务对象、服务内容可以分为工厂操作系统、行业云操作系统......
  • solidity签名机制和go联合调试学习
    1.solidity实现:1.1.引入eip712合约://SPDX-License-Identifier:MITpragmasolidity^0.8.0;/***@devhttps://eips.ethereum.org/EIPS/eip-712[EIP712]isastandardforhashingandsigningoftypedstructureddata.**TheencodingspecifiedintheEIPis......
  • Google Chrome Proxy error All In One
    GoogleChromeProxyerrorAllInOnemacOSWi-FiproxieswebproxyHTTPsecuritywebproxyHTTPSsocksproxydemos(......