使用Gorm开发ProtonBase应用示例
ProtonBase 支持基于主流 ORM(Object-Relational Mapping)框架开发应用,Gorm 是 Go 语言下的对象关系映射解决方案。本文介绍基于 Gorm 如何快速开发。
准备工作
- 在 ProtonBase 上创建 database
CREATE DATABASE example;
- 在新创建的 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 语言下的对象关系映射解决方案。
- 引入 Gorm 依赖。
go get -u gorm.io/gorm
- 定义结构体,每一张表都需要对应一个结构体。这里我们只有一张 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"
}
- 配置数据库连接参数
const (
Host = "localhost"
Port = 5432
Username = "root"
Password = "123456"
Database = "example"
)
- 通过以下代码,先向 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}