Skip to content

gorm 基础示例

本篇文档将指导你如何使用 golanggorm 构建一个简单的应用程序,并实现 CRUD(创建、读取、更新、删除)功能。

Gorm 是 Golang 语言中最流行的 ORM 工具之一。

开始前准备

相关软件的简单介绍:

  • Gorm:基于 golang 的一个神奇的全功能 ORM 库,本次教程主要通过使用 gorm.io/gormgorm.io/driver/mysql 这两个库来让 Go 连接到 MatrixOne 数据库并完成 CRUD 操作。

环境配置

在你开始之前,确认你已经下载并安装了如下软件:

  • 确认你已完成单机部署 MatrixOne。通过 MySQL 客户端连接 MatrixOne 并创建一个命名为 test 的数据库:
mysql> create database test;
#To check with Golang installation and its version
go version
  • 确认你已完成安装 MySQL 客户端。

  • 确认你已经安装 gorm.io/gorm 以及 gorm.io/driver/mysql,使用 go get 命令安装,代码如下:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

你可以参考 Golang 连接 MatrixOne 服务了解如何通过 Gorm 连接到 MatrixOne,本篇文档将指导你如何实现 CRUD(创建、读取、更新、删除)。

新建表

作为对象关系映射器(ORM)工具,Gorm 允许开发人员创建 GO 类来映射关系数据库中的表。 在下面的代码示例中,将创建一个 USER 类,这里的类名和属性名称必须使用大写英文开头以保证 public 访问,否则不能创建。USER 类在 GORM 的作用下将转化为一条 SQL 语句,创建表名为 users 的表。 新建一个 gorm_create.go 的文本文件,将以下代码拷贝粘贴到文件内:

package main
import (
    "fmt"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)
// user model
type USER struct {
    ID       uint `gorm:"primaryKey"`
    CNAME    string
    CADDRESS string
}

func getDBConn() *gorm.DB {
    dsn := "root:111@tcp(127.0.0.1:6001)/test?charset=utf8mb4&parseTime=True&loc=Local" //MO
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    // Logger: logger.Default.LogMode(logger.Info), //print SQL
  })
    // get connection
    if err != nil {
        fmt.Println("Database Connection Failed") //Connection failed
    } else {
        fmt.Println("Database Connection Succeed") //Connection succeed
    }
    return db
}

func main() {
    //get *gorm.DB
    db := getDBConn()

    // auto create table
    db.AutoMigrate(&USER{})
}

你可以取消注释 Logger: logger.Default.LogMode(logger.Info) 以把转化后的 SQL 输出出来。 打开终端,使用以下代码运行此 go 文件:

go run gorm_create.go

你可以使用 MySQL 客户端验证表是否创建成功:

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| users          |
+----------------+
1 row in set (0.01 sec)

插入数据

下面的演示中,将指导你在刚刚创建的 users 表中插入两条数据记录,这里的 ID 默认是自增的,也可以指定为固定的值。 新建一个 gorm_insert.go 的文本文件,将以下代码拷贝粘贴到文件内:

package main
import (
    "fmt"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)
// user model
type USER struct {
    ID       uint `gorm:"primaryKey"`
    CNAME    string
    CADDRESS string
}

func getDBConn() *gorm.DB {
    dsn := "root:111@tcp(127.0.0.1:6001)/test?charset=utf8mb4&parseTime=True&loc=Local" //MO
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    // get connection
    if err != nil {
        fmt.Println("Database Connection Failed") //Connection failed
    } else {
        fmt.Println("Database Connection Succeed") //Connection succeed
    }
    return db
}

func main() {
    //get *gorm.DB
    db := getDBConn()

    // auto create table
    db.AutoMigrate(&USER{})

  // **Insert users**
    users := []USER{
        {
            // ID: 1, //autoincrement
            CNAME:    "lili",
            CADDRESS: "Shanghai"},
        {
            ID:       111,
            CNAME:    "zhang",
            CADDRESS: "Biejing",
        },
    }

    db.Create(users)

}

打开终端,使用以下代码运行此 go 文件:

go run gorm_insert.go

同样的,终端也会输出 SQL 语句,你可以使用 MySQL 客户端验证表是否成功插入数据:

mysql> select * from users;
+------+-------+----------+
| id   | cname | caddress |
+------+-------+----------+
|    1 | lili  | Shanghai |
|  111 | zhang | Biejing  |
+------+-------+----------+
2 rows in set (0.01 sec)

查询数据

下面的演示中,将指导你用条件查询部分数据,查询 CNAME=zhang 的数据。 新建一个 gorm_query.go 的文本文件,将以下代码拷贝粘贴到文件内:

package main
import (
    "fmt"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)
// user model
type USER struct {
    ID       uint `gorm:"primaryKey"`
    CNAME    string
    CADDRESS string
}

func getDBConn() *gorm.DB {
    dsn := "root:111@tcp(127.0.0.1:6001)/test?charset=utf8mb4&parseTime=True&loc=Local" //MO
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    // get connection
    if err != nil {
        fmt.Println("Database Connection Failed") //Connection failed
    } else {
        fmt.Println("Database Connection Succeed") //Connection succeed
    }
    return db
}

func main() {
    //get *gorm.DB
    db := getDBConn()

    // auto create table
    db.AutoMigrate(&USER{})

  // **Query—— String condition** 
    res := USER{}
    tx := db.Where("CNAME = ? ", "zhang").Find(&USER{}).Scan(&res)
    if tx.Error != nil {
        fmt.Println(tx.Error)
        return
    }
    fmt.Println(res)

}

打开终端,使用以下代码运行此 go 文件:

go run gorm_query.go

终端的输出结果中将包含以下数据:

{111 zhang Biejing}

更新数据

下面的演示中,将指导你如何更新数据。 新建一个 gorm_update.go 的文本文件,将以下代码拷贝粘贴到文件内:

package main
import (
    "fmt"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)
// user model
type USER struct {
    ID       uint `gorm:"primaryKey"`
    CNAME    string
    CADDRESS string
}

func getDBConn() *gorm.DB {
    dsn := "root:111@tcp(127.0.0.1:6001)/test?charset=utf8mb4&parseTime=True&loc=Local" //MO
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    // get connection
    if err != nil {
        fmt.Println("Database Connection Failed") //Connection failed
    } else {
        fmt.Println("Database Connection Succeed") //Connection succeed
    }
    return db
}

func main() {
    //get *gorm.DB
    db := getDBConn()

    // auto create table
    db.AutoMigrate(&USER{})

  // **Update** 
    aUser := USER{}
    tx := db.Where("CNAME = ? ", "zhang").Find(&USER{}).Scan(&aUser)
    if tx.Error != nil {
        fmt.Println(tx.Error)
        return
    }
    res:=db.Model(&aUser).Update("CADDRESS", "HongKong")
  if res.Error != nil {
        fmt.Println(tx.Error)
        return
    }

}

打开终端,使用以下代码运行此 go 文件:

go run gorm_update.go

你可以使用 MySQL 客户端验证表是否更新成功:

mysql> select * from users;
+------+-------+----------+
| id   | cname | caddress |
+------+-------+----------+
|  111 | zhang | HongKong |
|    1 | lili  | Shanghai |
+------+-------+----------+
2 rows in set (0.00 sec)

删除数据

下面的演示中,将指导你如何进行单条数据的删除。需要注意的是,在删除单条记录时,需要指定主键,否则可能会触发批量删除。 新建一个 gorm_delete.go 的文本文件,将以下代码拷贝粘贴到文件内:

package main
import (
    "fmt"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)
// user model
type USER struct {
    ID       uint `gorm:"primaryKey"`
    CNAME    string
    CADDRESS string
}

func getDBConn() *gorm.DB {
    dsn := "root:111@tcp(127.0.0.1:6001)/test?charset=utf8mb4&parseTime=True&loc=Local" //MO
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    // get connection
    if err != nil {
        fmt.Println("Database Connection Failed") //Connection failed
    } else {
        fmt.Println("Database Connection Succeed") //Connection succeed
    }
    return db
}

func main() {
    //get *gorm.DB
    db := getDBConn()

    // auto create table
    db.AutoMigrate(&USER{})

  // **Delete** 
    aUser := USER{}
    tx := db.Where("CNAME = ? ", "zhang").Find(&USER{}).Scan(&aUser)
    if tx.Error != nil {
        fmt.Println(tx.Error)
        return
    }
    res := db.Delete(&aUser)
    if res.Error != nil {
        fmt.Println(tx.Error)
        return
    }

}

打开终端,使用以下代码运行此 go 文件:

go run gorm_delete.go

你可以使用 MySQL 客户端验证表是否删除成功:

mysql> select * from users;
+------+-------+----------+
| id   | cname | caddress |
+------+-------+----------+
|    1 | lili  | Shanghai |
+------+-------+----------+
1 row in set (0.00 sec)

以上仅是 GORM 中 CRUD 操作的部分演示,更多的用法和案例可以参考 GORM 官方指南