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相关推荐

  1. 开源NewSQL – CockroachDB在百度内部的应用与实践

    内容来源:2017 年 11 月 18 日,百度数据库架构师严龙在"第七届数据技术嘉年华"进行<百度NewSQL-CockroachDB>演讲分享.IT 大咖说(微信i ...

  2. Golang#Typora-Golang笔记

    知名编程语言或系统的发展简史 一.B语言 B语言之父:Ken Thompson(肯.汤普森).B语言是贝尔实验室开发的一种通用的程序设计语言,它是于1969年前后Ken Thompson(肯.汤普森) ...

  3. 站在山顶上看golang的前世今生与未来展望

    Go前景 Tiobe编程语言2021年10月排行榜 目前go的开发人员是比较缺的,所以对于工作经验的要求不太高. 市场强劲需求 Go语言优势 兼顾C语言级别的编译.运行效率,容易部署,PHP级别的开发 ...

  4. golang 开源项目全集

    一直更新中,地址:https://github.com/golang/go/wiki/Projects#zeromq Indexes and search engines These sites pr ...

  5. Golang优秀开源项目汇总(持续更新。。。)

    Golang优秀开源项目汇总(持续更新...) 我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open ...

  6. 为什么劝你要学习Golang以及GO语言(Go语言知识普及)

    Go语言 一. Go语言的由来 Go语言亦叫Golang语言,是由谷歌Goggle公司推出. 传统的语言比如c++,大家花费太多时间来学习如何使用这门语言,而不是如何更好的表达写作者的思想,同时编译 ...

  7. 构建微服务的十大 Golang 框架和库

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 现在已经有很多开 ...

  8. 盘点 GitHub 那些标星超过 20 K 的 Golang 优质开源项目

    前言 Golang 作为一门还在快速成长的编程语言,想要与时俱进,还得多看看这几个开源项目. 听说你想学习 Go 语言,那我就来总结一下:那些目前我所了解的优质 Golang 开源项目. Go 自己 ...

  9. 自学golang【第一章:go语言基础知识】为什么要学习go语言?go语言与c语言的关系?go语言创始人?go语言的特性有哪些?go语言适合做什么?国内外有哪些企业或项目使用go语言?

    事先声明:本文部分内容参考了尹成的笔记,如果侵权请联系删除. 我是一名自学go语言的初学者,从今天开始我将会坚持更新go语言的相关知识,从入门到精通,如果大家有什么需要可以加我QQ:239479969 ...

最新文章

  1. 常用对照表之TCP及UDP常见端口参照
  2. java空值转datetime,关于java1.8中LocalDateTime实现日期,字符串互转小坑。
  3. 2020-12-17 Latex代码公式中如何设定多个对齐点( Multiple aligning symbols )
  4. Visual Studio各个版本对应关系
  5. 新手学习嵌入式需要掌握的几点知识点
  6. mysql5.7.23主主重制_MySQL5.7.23,主从复制的使用
  7. IIC控制设计读写EEPROM
  8. 冲着名为Sundy的男人去麦子学院
  9. 思科模拟器Cisco Packet Tracer的汉化教程
  10. 互联网的寒冬【感慨】
  11. vs code中英文标点符号自动更改
  12. 三层交换机实现不同vlan间通信
  13. 信号完整性(SI)电源完整性(PI)学习笔记(二十八)S参数在信号完整性中的应用(三)
  14. 如何进行用户画像分析
  15. 脚手架的这个好搭档 今天要重点来介绍下!
  16. 百度今天怎么打不开了
  17. 独热编码(OneHotEncoder)和标签编码(LabelEncoder)
  18. win10下安装cuda和cudnn
  19. Spring框架技术总结(一),java编程自学教程
  20. 如何用数字化构建企业的“韧性”?

热门文章

  1. cookie实现登录功能
  2. 工程建材企业必看:应用集中采购协同系统,实现降本增效,提升企业效益!
  3. golang安装protobuf 2022最新安装教程(windows)
  4. UTF-8和GBK互转问题
  5. springboot中使用socket对接第三方接口
  6. C语言 define 关键字
  7. ANSYS安装中出现的问题(修改用户名为英文)
  8. Unity 触摸屏旋转和缩放
  9. 《MySQL必知必会》学习笔记之“数据库的检索”
  10. {推荐}-----IT职业生涯规划PPT