Golang使用gopg访问MemFireDB数据库

本篇介绍如何使用Golang访问MemFireDB数据库。

如果大家有个人项目或者公司内部测试项目,推荐大家尝试MemFire Cloud,不用自己搭建数据库,在家或者公司随时可以访问。

gopg是Golang中最常用的访问数据库的ORM库,MemFireDB兼容Postgres接口,所以可以直接把MemFireDB当Postgres使用。

在 memfiredb.com 上创建数据库时,可以选择创建密码或者证书两种认证模式,在公网上部署的数据库,如果存储的是比较重要的数据,建议使用证书认证模式,该模式安全系数要高很多,撞库、彩虹表、暴力破解等传统的密码破解方式对证书认证是无能为力的。如果只是简单测试,可以使用密码认证方式,这种方式配置简单些。

下面是示例代码:

1 2import ( 3 "context" 4 "flag" 5 "fmt" 6 "github.com/go-pg/pg/v10" 7 "github.com/go-pg/pg/v10/orm" 8 "strings" 9 "sync" 10) 11 12var ( 13 addr = flag.String("addr", "192.168.80.161:5433", "memfire address to connect") 14 user = flag.String("user", "test", "memfire user") 15 passwd = flag.String("passwd", "test", "memfire password") 16 dbname = flag.String("db", "dbname", "memfire database name to connect") 17) 18 19func panicIf(err error) { 20 if err != nil { 21 panic(err) 22 } 23} 24 25func test_transaction_try_again(db *pg.DB) { 26 incrInTx := func(db *pg.DB) error { 27 // Transaction is automatically rolled back on error. 28 return db.RunInTransaction(db.Context(), func(tx *pg.Tx) error { 29 var counter int 30 _, err := tx.QueryOne( 31 pg.Scan(&counter), `SELECT counter FROM counters FOR UPDATE`) 32 if err != nil { 33 return err 34 } 35 36 counter++ 37 38 _, err = tx.Exec(`UPDATE counters SET counter = ?`, counter) 39 return err 40 }) 41 } 42 43 var wg sync.WaitGroup 44 for i := 0; i < 10; i++ { 45 wg.Add(1) 46 go func() { 47 defer wg.Done() 48 for { 49 err := incrInTx(db) 50 if err != nil { 51 if strings.Contains(err.Error(), "40001") || 52 strings.Contains(err.Error(), "Try again") || 53 strings.Contains(err.Error(), "Restart read required") { 54 fmt.Println("Try again") 55 continue 56 } 57 panic(err) 58 } 59 break 60 } 61 62 }() 63 } 64 wg.Wait() 65} 66 67type Counter struct { 68 Counter int64 69} 70 71type User struct { 72 Id int64 73 Name string 74 Emails []string 75} 76 77// createSchema creates database schema for Counter/ User 78func createSchema(db *pg.DB) error { 79 models := []interface{}{ 80 (*Counter)(nil), 81 (*User)(nil), 82 } 83 84 for _, model := range models { 85 err := db.Model(model).CreateTable(&orm.CreateTableOptions{ 86 Temp: false, 87 IfNotExists: true, 88 }) 89 if err != nil { 90 return err 91 } 92 } 93 return nil 94} 95 96func main() { 97 flag.Parse() 98 99 opt := pg.Options{ 100 Addr: *addr, 101 User: *user, 102 Password: *passwd, 103 Database: *dbname, 104 OnConnect: func(ctx context.Context, cn *pg.Conn) error { 105 println("new connection created") 106 return nil 107 }, 108 } 109 110 db := pg.Connect(&opt) 111 defer db.Close() 112 113 err := createSchema(db) 114 panicIf(err) 115 116 _, err = db.Exec("delete from counters") 117 panicIf(err) 118 119 cnt := &Counter{ 120 Counter: 1, 121 } 122 _, err = db.Model(cnt).Insert() 123 panicIf(err) 124 125 test_transaction_try_again(db) 126}
点赞
收藏

评论区

加载中...

相关推荐

超轻量级的VSCode插件,数据库想用就用~

MemFireCloud是一个便捷、灵活、高效的云服务平台,依托于分布式数据库MemFireDB的云原生和线性扩展能力,为互联网用户提供一站式数据库自助服务。介绍MemFireCloud推出VSCode的可视化数据库管理插件,提供操作数据库的图形界面,帮助开发人员轻松简单的写代码,边操作数据库。其主要功能包括:连接管理:统一管理所有的数据库连接;

快速入门|使用MemFire Cloud构建Next.js应用程序

MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专注于编写前端应用程序代码,加速WEB或APP应用开发。此示例提供了使用MemFireCloud和Next

快速入门|使用MemFire Cloud构建Vue3应用程序

MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专注于编写前端应用程序代码,加速WEB或APP应用开发。此示例提供了使用MemFireCloud和Vue3

重磅来袭|MemFire Cloud 推出的后端即服务内测版本上线啦~

新版本与大家正式见面啦!该版本,MemFireCloud致力于提供“开箱即用”的后端服务,为应用开发人员全面“减负”,快来开启您的应用之旅吧。MemFireCloud推出基于Supabase与MemFireDB打造的后端服务,主要包含以下功能特性:兼容PG的MemFireDB数据库托管,存储结构化数据,自动拓展身份验证和授权,统一管理注册用户,控

我们也从 Python 转向了 Golang -- MemFireDB

首先说明一下,Python也是我最喜欢的一门编程语言,我用Python工作了接近8年,并且会一直使用下去。我们团队在开启这个项目之初就做出了从Python往golang转换的预期,因此我们的转换过程没有任何障碍,非常顺利的就完成了。我们为什么会在项目开启之初就做出要更换编程语言的决定呢,为什么不一开始就选择Golang呢?第一个问题

Python使用SQLAlchemy访问MemFireDB

之前看到一个帖子说的挺好,项目开发尽量不要自己造轮子,能用开源项目或者SAAS服务尽量用,很多事情都是跟时间赛跑。如果大家有个人项目或者公司内部测试项目,,推荐大家尝试一下,挺方便的,不用自己搭建数据库,在家或者公司随时可以访问。SQLAlchemy是Python中最常用的访问数据库的ORM库,MemFireDB兼容Postgres接口,所以可以直接把Mem