Golang使用gopg访问MemFireDB数据库

艾木酱
• 阅读 1227

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

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

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

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

下面是示例代码:


import (
 "context"
 "flag"
 "fmt"
 "github.com/go-pg/pg/v10"
 "github.com/go-pg/pg/v10/orm"
 "strings"
 "sync"
)

var (
 addr   = flag.String("addr", "192.168.80.161:5433", "memfire address to connect")
 user   = flag.String("user", "test", "memfire user")
 passwd = flag.String("passwd", "test", "memfire password")
 dbname = flag.String("db", "dbname", "memfire database name to connect")
)

func panicIf(err error) {
 if err != nil {
  panic(err)
 }
}

func test_transaction_try_again(db *pg.DB) {
 incrInTx := func(db *pg.DB) error {
  // Transaction is automatically rolled back on error.
  return db.RunInTransaction(db.Context(), func(tx *pg.Tx) error {
   var counter int
   _, err := tx.QueryOne(
    pg.Scan(&counter), `SELECT counter FROM counters FOR UPDATE`)
   if err != nil {
    return err
   }

   counter++

   _, err = tx.Exec(`UPDATE counters SET counter = ?`, counter)
   return err
  })
 }

 var wg sync.WaitGroup
 for i := 0; i < 10; i++ {
  wg.Add(1)
  go func() {
   defer wg.Done()
   for {
    err := incrInTx(db)
    if err != nil {
     if strings.Contains(err.Error(), "40001") ||
      strings.Contains(err.Error(), "Try again") ||
      strings.Contains(err.Error(), "Restart read required") {
      fmt.Println("Try again")
      continue
     }
     panic(err)
    }
    break
   }

  }()
 }
 wg.Wait()
}

type Counter struct {
 Counter int64
}

type User struct {
 Id     int64
 Name   string
 Emails []string
}

// createSchema creates database schema for Counter/ User
func createSchema(db *pg.DB) error {
 models := []interface{}{
  (*Counter)(nil),
  (*User)(nil),
 }

 for _, model := range models {
  err := db.Model(model).CreateTable(&orm.CreateTableOptions{
   Temp:        false,
   IfNotExists: true,
  })
  if err != nil {
   return err
  }
 }
 return nil
}

func main() {
 flag.Parse()

 opt := pg.Options{
  Addr:     *addr,
  User:     *user,
  Password: *passwd,
  Database: *dbname,
  OnConnect: func(ctx context.Context, cn *pg.Conn) error {
   println("new connection created")
   return nil
  },
 }

 db := pg.Connect(&opt)
 defer db.Close()

 err := createSchema(db)
 panicIf(err)

 _, err = db.Exec("delete from counters")
 panicIf(err)

 cnt := &Counter{
  Counter: 1,
 }
 _, err = db.Model(cnt).Insert()
 panicIf(err)

 test_transaction_try_again(db)
}
点赞
收藏
评论区
推荐文章
艾木酱 艾木酱
2年前
超轻量级的VSCode插件,数据库想用就用~
MemFireCloud是一个便捷、灵活、高效的云服务平台,依托于分布式数据库MemFireDB的云原生和线性扩展能力,为互联网用户提供一站式数据库自助服务。介绍MemFireCloud推出VSCode的可视化数据库管理插件,提供操作数据库的图形界面,帮助开发人员轻松简单的写代码,边操作数据库。其主要功能包括:连接管理:统一管理所有的数据库连接;
艾木酱 艾木酱
2年前
快速入门|使用MemFire Cloud构建Vue3应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专注于编写前端应用程序代码,加速WEB或APP应用开发。此示例提供了使用MemFireCloud和Vue3
艾木酱 艾木酱
2年前
快速入门|使用MemFire Cloud构建Next.js应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专注于编写前端应用程序代码,加速WEB或APP应用开发。此示例提供了使用MemFireCloud和Next
艾木酱 艾木酱
3年前
重磅来袭|MemFire Cloud 推出的后端即服务内测版本上线啦~
新版本与大家正式见面啦!该版本,MemFireCloud致力于提供“开箱即用”的后端服务,为应用开发人员全面“减负”,快来开启您的应用之旅吧。MemFireCloud推出基于Supabase与MemFireDB打造的后端服务,主要包含以下功能特性:兼容PG的MemFireDB数据库托管,存储结构化数据,自动拓展身份验证和授权,统一管理注册用户,控
艾木酱 艾木酱
3年前
我们也从 Python 转向了 Golang -- MemFireDB
首先说明一下,Python也是我最喜欢的一门编程语言,我用Python工作了接近8年,并且会一直使用下去。我们团队在开启这个项目之初就做出了从Python往golang转换的预期,因此我们的转换过程没有任何障碍,非常顺利的就完成了。我们为什么会在项目开启之初就做出要更换编程语言的决定呢,为什么不一开始就选择Golang呢?第一个问题
艾木酱 艾木酱
3年前
Python使用SQLAlchemy访问MemFireDB
之前看到一个帖子说的挺好,项目开发尽量不要自己造轮子,能用开源项目或者SAAS服务尽量用,很多事情都是跟时间赛跑。如果大家有个人项目或者公司内部测试项目,,推荐大家尝试一下,挺方便的,不用自己搭建数据库,在家或者公司随时可以访问。SQLAlchemy是Python中最常用的访问数据库的ORM库,MemFireDB兼容Postgres接口,所以可以直接把Mem
艾木酱 艾木酱
3年前
PostgreSQL的函数和存储过程--MemFireDB
简介PostgreSQL是最流行的对象关系型数据库系统。它是一个强大的、高性能的数据库系统。在这篇文章中,我们将讨论如何使用函数和存储过程来执行操作,如插入、删除、更新和查询。感兴趣的同学可以通过memfiredb.com提供的免费云数据库一边操作一边阅读。函数一般来说,函数是一组进行任何操作的SQL语句,如选择、插入、删除和更新。在PostgreSQ
Stella981 Stella981
3年前
LVS+Keepalived负载均衡实践与心得补遗
一.实践背景,分析:公司研发的业务系统某个功能频繁出现数据库Mysql性能问题,导致系统使用卡顿,响应慢,且数据库所在服务器CPU负载居高不下,影响其他项目系统的正常数据库访问和使用。除去研发人员优化sql工作外,作为运维人员可以尝试对当前服务架构改造,目前架构大致如下:!(https://static.oschina.net/uploads/i
艾木酱 艾木酱
2年前
应用实战|使用DBGate管理MemFireDB数据库
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专注于编写前端应用程序代码,加速WEB或APP应用开发。简介DbGate是一款开源、开源、跨平台的数据库管理功能
艾木酱 艾木酱
2年前
快速入门|使用MemFire Cloud构建Flutter应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专注于编写前端应用程序代码,加速WEB或APP应用开发。此示例提供了使用MemFireCloud和Flut