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
}
funcmain() {
var err error
db, err = sql.Open("duckdb", "?access_mode=READ_WRITE") //设置读写权限//db, err = sql.Open("duckdb", "test.db") //存储在本地,叫test.dbif 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()
}
funccheck(args ...interface{}) {
err := args[len(args)-1]
if err != nil {
panic(err)
}
}
funcrunTransaction() {
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")
}
}
functestPreparedStmt() {
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/1710:59:30DBopenedwithaccessmoderead_write2024/06/1710:59:30marcis99yearsold,1.91tall,bday on 1970-01-01T00:00:00Z and has awesomeness:true2024/06/1710:59:30macgyveris70yearsold,1.85tall,bday on 1951-01-23T00:00:00Z and has awesomeness:true2024/06/1710:59:30Deleted2rows2024/06/1710:59:30Startingtransaction...2024/06/1710:59:30UserGruwasinserted2024/06/1710:59:30Rollingbacktransaction...2024/06/1710:59:30Couldn'tfinduserGru2024/06/1710:59:30Kevinis11yearsold,0.55tall,bday on 2013-07-06T00:00:00Z and has awesomeness:true2024/06/1710:59:30Bobis12yearsold,0.73tall,bday on 2012-11-04T00:00:00Z and has awesomeness:true2024/06/1710:59:30Stuartis13yearsold,0.66tall,bday on 2014-02-12T00:00:00Z and has awesomeness:true
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现