golang使用CockroachDB
golang使用CockroachDB
步骤1.安装Go pq驱动程序
go get -u github.com/lib/pq
步骤2.创建maxroach用户和bank数据库
启动内置的SQL客户端:
cockroach sql --certs-dir=certs
在SQL Shell中,发出以下语句来创建maxroach用户和bank数据库:
CREATE USER IF NOT EXISTS maxroach;CREATE DATABASE bank;
授予maxroach用户必要的权限:
GRANT ALL ON DATABASE bank TO maxroach;
退出SQL Shell:
\q
步骤3.为maxroach用户生成证书
maxroach通过运行以下命令为用户创建证书和密钥。代码示例将以该用户身份运行。
cockroach cert create-client maxroach --certs-dir=certs --ca-key=my-safe-directory/ca.key
步骤4.运行Go代码
现在已经有了一个数据库和一个用户,将运行代码来创建表并插入一些行,然后运行代码以作为原子事务读取和更新值。
基本陈述
首先,使用以下代码以maxroach用户身份连接并执行一些基本的SQL语句,创建表,插入行以及读取和打印行。
package mainimport ("database/sql"
"fmt"
"log"_ "github.com/lib/pq"
)func main() {db, err := sql.Open("postgres","postgresql://maxroach@localhost:26257/bank?ssl=true&sslmode=require&sslrootcert=certs/ca.crt&sslkey=certs/client.maxroach.key&sslcert=certs/client.maxroach.crt")if err != nil {log.Fatal("error connecting to the database: ", err)}defer db.Close()if _, err := db.Exec("CREATE TABLE IF NOT EXISTS accounts (id INT PRIMARY KEY, balance INT)"); err != nil {log.Fatal(err)}if _, err := db.Exec("INSERT INTO accounts (id, balance) VALUES (1, 1000), (2, 250)"); err != nil {log.Fatal(err)}rows, err := db.Query("SELECT id, balance FROM accounts")
if err != nil {log.Fatal(err)
}
defer rows.Close()
fmt.Println("Initial balances:")
for rows.Next() {var id, balance intif err := rows.Scan(&id, &balance); err != nil {log.Fatal(err)}fmt.Printf("%d %d\n", id, balance)
}
}
创建事务(带重试逻辑)
Go代码:
package mainimport ("context""database/sql""fmt""log""github.com/cockroachdb/cockroach-go/crdb"
)func transferFunds(tx *sql.Tx, from int, to int, amount int) error {var fromBalance intif err := tx.QueryRow("SELECT balance FROM accounts WHERE id = $1", from).Scan(&fromBalance); err != nil {return err}if fromBalance < amount {return fmt.Errorf("insufficient funds")}if _, err := tx.Exec("UPDATE accounts SET balance = balance - $1 WHERE id = $2", amount, from); err != nil {return err}if _, err := tx.Exec("UPDATE accounts SET balance = balance + $1 WHERE id = $2", amount, to); err != nil {return err}return nil
}func main() {//非安全模式db, err := sql.Open("postgres", "postgresql://maxroach@localhost:26257/bank?sslmode=disable")//安全模式//db, err := sql.Open("postgres", "postgresql://maxroach@localhost:26257/bank?ssl=true&sslmode=require&sslrootcert=certs/ca.crt&sslkey=certs/client.maxroach.key&sslcert=certs/client.maxroach.crt")if err != nil {log.Fatal("error connecting to the database: ", err)}// Run a transfer in a transaction.err = crdb.ExecuteTx(context.Background(), db, nil, func(tx *sql.Tx) error {return transferFunds(tx, 1 /* from acct# */, 2 /* to acct# */, 100 /* amount */)})if err == nil {fmt.Println("Success")} else {log.Fatal("error: ", err)}
}
在默认的隔离级别SERIALIZABLE下,因读写冲突导致事务执行失败,需要用户主动地重新提交事务。用户也实现通用的retry函数在事务内部重新执行事务。
在Golang环境下,CockroachDB的retry函数位于CockroachDB Go客户端的crdb包中,用户需要将相关库克隆到$GOPATH当中:
mkdir -p $GOPATH/src/github.com/cockroachdb
cd $GOPATH/src/github.com/cockroachdb
git clone git@github.com:cockroachdb/cockroach-go.git
执行:
go run txn-sample.go
输出:
Success
执行查询:
cockroach sql --insecure -e 'SELECT id, balance FROM accounts' --database=bank
+----+---------+
| id | balance |
+----+---------+
| 1 | 900 |
| 2 | 350 |
+----+---------+
(2 rows)
使用GORM框架
步骤 1: 安装GORM
go get -u github.com/lib/pq # dependency
go get -u github.com/jinzhu/gorm
步骤 2: 启动节点
以非安全模式启动节点:
cockroach start --insecure --store=hello-1 --host=localhost
步骤 3: 创建用户
执行cockroach user命令创建maxroach用户:
cockroach user set maxroach --insecure
步骤 4: 创建数据库并授权
以root用户启动内置的SQL客户端,创建bank数据库并授权maxroach用户。
cockroach sql --insecure -e 'CREATE DATABASE bank'
cockroach sql --insecure -e 'GRANT ALL ON DATABASE bank TO maxroach'
步骤 5: 编写执行Go代码
下述Go代码中,代码db.AutoMigrate(&Account{}将根据Account模型创建accounts表:
package mainimport ("fmt""log""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/postgres"
)type Account struct {ID int `gorm:"primary_key"`Balance int
}func main() {//非安全模式const addr = "postgresql://maxroach@localhost:26257/bank?sslmode=disable"//安全模式//const addr = "postgresql://maxroach@localhost:26257/bank?ssl=true&sslmode=require&sslrootcert=certs/ca.crt&sslkey=certs/client.maxroach.key&sslcert=certs/client.maxroach.crt"db, err := gorm.Open("postgres", addr)if err != nil {log.Fatal(err)}defer db.Close()db.AutoMigrate(&Account{})db.Create(&Account{ID: 1, Balance: 1000})db.Create(&Account{ID: 2, Balance: 250})var accounts []Accountdb.Find(&accounts)fmt.Println("Initial balances:")for _, account := range accounts {fmt.Printf("%d %d\n", account.ID, account.Balance)}
}
执行:
go run gorm-basic-sample.go
输出:
Initial balances:
1 1000
2 250
执行查询:
cockroach sql --insecure -e 'SELECT id, balance FROM accounts' --database=bank
+----+---------+
| id | balance |
+----+---------+
| 1 | 1000 |
| 2 | 250 |
+----+---------+
(2 rows)
golang使用CockroachDB相关推荐
- 开源NewSQL – CockroachDB在百度内部的应用与实践
内容来源:2017 年 11 月 18 日,百度数据库架构师严龙在"第七届数据技术嘉年华"进行<百度NewSQL-CockroachDB>演讲分享.IT 大咖说(微信i ...
- Golang#Typora-Golang笔记
知名编程语言或系统的发展简史 一.B语言 B语言之父:Ken Thompson(肯.汤普森).B语言是贝尔实验室开发的一种通用的程序设计语言,它是于1969年前后Ken Thompson(肯.汤普森) ...
- 站在山顶上看golang的前世今生与未来展望
Go前景 Tiobe编程语言2021年10月排行榜 目前go的开发人员是比较缺的,所以对于工作经验的要求不太高. 市场强劲需求 Go语言优势 兼顾C语言级别的编译.运行效率,容易部署,PHP级别的开发 ...
- golang 开源项目全集
一直更新中,地址:https://github.com/golang/go/wiki/Projects#zeromq Indexes and search engines These sites pr ...
- Golang优秀开源项目汇总(持续更新。。。)
Golang优秀开源项目汇总(持续更新...) 我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open ...
- 为什么劝你要学习Golang以及GO语言(Go语言知识普及)
Go语言 一. Go语言的由来 Go语言亦叫Golang语言,是由谷歌Goggle公司推出. 传统的语言比如c++,大家花费太多时间来学习如何使用这门语言,而不是如何更好的表达写作者的思想,同时编译 ...
- 构建微服务的十大 Golang 框架和库
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 现在已经有很多开 ...
- 盘点 GitHub 那些标星超过 20 K 的 Golang 优质开源项目
前言 Golang 作为一门还在快速成长的编程语言,想要与时俱进,还得多看看这几个开源项目. 听说你想学习 Go 语言,那我就来总结一下:那些目前我所了解的优质 Golang 开源项目. Go 自己 ...
- 自学golang【第一章:go语言基础知识】为什么要学习go语言?go语言与c语言的关系?go语言创始人?go语言的特性有哪些?go语言适合做什么?国内外有哪些企业或项目使用go语言?
事先声明:本文部分内容参考了尹成的笔记,如果侵权请联系删除. 我是一名自学go语言的初学者,从今天开始我将会坚持更新go语言的相关知识,从入门到精通,如果大家有什么需要可以加我QQ:239479969 ...
最新文章
- 常用对照表之TCP及UDP常见端口参照
- java空值转datetime,关于java1.8中LocalDateTime实现日期,字符串互转小坑。
- 2020-12-17 Latex代码公式中如何设定多个对齐点( Multiple aligning symbols )
- Visual Studio各个版本对应关系
- 新手学习嵌入式需要掌握的几点知识点
- mysql5.7.23主主重制_MySQL5.7.23,主从复制的使用
- IIC控制设计读写EEPROM
- 冲着名为Sundy的男人去麦子学院
- 思科模拟器Cisco Packet Tracer的汉化教程
- 互联网的寒冬【感慨】
- vs code中英文标点符号自动更改
- 三层交换机实现不同vlan间通信
- 信号完整性(SI)电源完整性(PI)学习笔记(二十八)S参数在信号完整性中的应用(三)
- 如何进行用户画像分析
- 脚手架的这个好搭档 今天要重点来介绍下!
- 百度今天怎么打不开了
- 独热编码(OneHotEncoder)和标签编码(LabelEncoder)
- win10下安装cuda和cudnn
- Spring框架技术总结(一),java编程自学教程
- 如何用数字化构建企业的“韧性”?