使用Gorm开发ProtonBase应用示例

ProtonBase 支持基于主流 ORM(Object-Relational Mapping)框架开发应用,Gorm 是 Go 语言下的对象关系映射解决方案。本文介绍基于 Gorm 如何快速开发。

准备工作

  1. 在 ProtonBase 上创建 database
CREATE DATABASE example;
  1. 在新创建的 database 上创建 table
CREATE TABLE customer (
    id bigint NOT NULL,
    name text NOT NULL,
    email text NOT NULL,
    create_time timestamp DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

Gorm 示例

Gorm 是 Go 语言下的对象关系映射解决方案。

  1. 引入 Gorm 依赖。
go get -u gorm.io/gorm
  1. 定义结构体,每一张表都需要对应一个结构体。这里我们只有一张 customer 表,只需要编写一个 Customer 结构体即可。在定义结构体时,我们需要指明字段与数据库列的对应关系。
type Customer struct {
    Id         int64     `gorm:"column:id;primaryKey"`
    Name       string    `gorm:"column:name;not null"`
    Email      string    `gorm:"column:email;not null"`
    CreateTime time.Time `gorm:"column:create_time;default:CURRENT_TIMESTAMP()"`
}
 
func (customer Customer) TableName() string {
    return "customer"
}
  1. 配置数据库连接参数
const (
   Host     = "localhost"
   Port     = 5432
   Username = "root"
   Password = "123456"
   Database = "example"
)
  1. 通过以下代码,先向 customer 表中插入(insert)两条新纪录,然后查询(select)cluster 表验证插入已生效;再修改(update)其中的一条记录,查询表中记录验证修改已生效;最后删除其中一条记录,查询表中记录验证删除已生效。
func main() {
    dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", Host, Port, Username, Password, Database)
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{SkipDefaultTransaction: true})
    if err != nil {
        log.Fatal(err)
    }
 
    // Insert
    if err := Insert(db); err != nil {
        log.Fatal(err)
    }
 
    // Select
    fmt.Println("Result of the first selection:")
    if err := Select(db); err != nil {
        log.Fatal(err)
    }
 
    // Update
    if err := Update(db); err != nil {
        log.Fatal(err)
    }
 
    // Select
    fmt.Println("Result of the second selection:")
    if err := Select(db); err != nil {
        log.Fatal(err)
    }
 
    // Delete
    if err := Delete(db); err != nil {
        log.Fatal(err)
    }
 
    // Select
    fmt.Println("Result of the third selection:")
    if err := Select(db); err != nil {
        log.Fatal(err)
    }
}
 
func Insert(db *gorm.DB) error {
    tx := db.Begin()
    defer func() {
        if r := recover(); r != nil {
            tx.Rollback()
        }
    }()
 
    if err := tx.Error; err != nil {
        return err
    }
 
    firstCustomer := Customer{Id: 1, Name: "Jacob Emily", Email: "jacob.emily@protonbase.io"}
    if err := tx.Create(&firstCustomer).Error; err != nil {
        tx.Rollback()
        return err
    }
 
    secondCustomer := Customer{Id: 2, Name: "Michael Emma", Email: "michael.emma@protonbase.io"}
    if err := tx.Create(&secondCustomer).Error; err != nil {
        tx.Rollback()
        return err
    }
 
    return tx.Commit().Error
}
 
func Select(db *gorm.DB) error {
    var customers []Customer
    result := db.Find(&customers, []int{1, 2})
    if err := result.Error; err != nil {
        return err
    }
    for _, customer := range customers {
        fmt.Println(customer)
    }
    return nil
}
 
func Update(db *gorm.DB) error {
    return db.Model(&Customer{Id: 2}).Updates(&Customer{Email: "michael.emma@gmail.com"}).Error
}
 
func Delete(db *gorm.DB) error {
    return db.Delete(&Customer{Id: 1}).Error
}

运行结果如下:

Result of the first selection:
{1 Jacob Emily jacob.emily@protonbase.io 2023-10-29 00:40:16.749842 +0000 UTC}
{2 Michael Emma michael.emma@protonbase.io 2023-10-29 00:40:16.749842 +0000 UTC}
Result of the second selection:
{1 Jacob Emily jacob.emily@protonbase.io 2023-10-29 00:40:16.749842 +0000 UTC}
{2 Michael Emma michael.emma@gmail.com 2023-10-29 00:40:16.749842 +0000 UTC}
Result of the third selection:
{2 Michael Emma michael.emma@gmail.com 2023-10-29 00:40:16.749842 +0000 UTC}