gorm 基础示例
本篇文档将指导你如何使用 golang 和 gorm 构建一个简单的应用程序,并实现 CRUD(创建、读取、更新、删除)功能。
Gorm 是 Python 语言中最流行的 ORM 工具之一。
开始前准备
相关软件的简单介绍:
- Gorm:基于 golang 的一个神奇的全功能 ORM 库,本次教程主要通过使用
gorm.io/gorm和gorm.io/driver/mysql这两个库来让 Go 连接到 MYSQL 数据库并完成 CRUD 操作。
环境配置
在你开始之前,确认你已经下载并安装了如下软件:
-
确认你已完成安装 MySQL 客户端。
-
已完成创建实例,并通过 MySQL 客户端连接 MatrixOne Intelligence 并创建一个命名为 test 的数据库:
mysql> create database test; -
确认你已完成安装 Golang 1.18 版本及以上,可以使用下面的命令行确认你的 Golang 版本:
#To check with Golang installation and its version go version -
确认你已经安装
gorm.io/gorm以及gorm.io/driver/mysql,使用go get命令安装,代码如下:go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
你可以参考 Golang 连接 MatrixOne Intelligence 服务了解如何通过 Gorm 连接到 MatrixOne Intelligence,本篇文档将指导你如何实现 CRUD(创建、读取、更新、删除)。
新建表
作为对象关系映射器(ORM)工具,Gorm 允许开发人员创建 GO 类来映射关系数据库中的表。
在下面的代码示例中,将创建一个 USER 类,这里的类名和属性名称必须使用大写英文开头以保证 public 访问,否则不能创建。USER 类在 GORM 的作用下将转化为一条 SQL 语句,创建表名为 users 的表。
新建一个 gorm_create.go 的文本文件,将以下代码拷贝粘贴到文件内:
package main
import (
"fmt"
"net/url"
"strconv"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// user model
type USER struct {
ID uint `gorm:"primaryKey"`
CNAME string
CADDRESS string
}
func getDBConn() *gorm.DB {
username := "585b49fc_852b_4bd1_b6d1_d64bc1d8xxxx:admin:accountadmin" // modify this
host := "freetier-01.cn-hangzhou.cluster.matrixonecloud.cn" // modify this
password := "your_password" // modify this
port := 6001
database := "test"
encodedUsername := url.QueryEscape(username)
dsn := encodedUsername + ":" + password + "@tcp(" + host + ":" + strconv.Itoa(port) + ")/" + database
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{})
}
你可能注意到了,以上的示例代码中使用到了 url.QueryEscape() 对 username 进行了编码,那是因为 username 中存在英文冒号 :,这样做可以确保连接串中的参数值不会干扰连接串的结构。
你可以取消注释 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"
"net/url"
"strconv"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// user model
type USER struct {
ID uint `gorm:"primaryKey"`
CNAME string
CADDRESS string
}
func getDBConn() *gorm.DB {
username := "585b49fc_852b_4bd1_b6d1_d64bc1d8xxxx:admin:accountadmin" // modify this
host := "freetier-01.cn-hangzhou.cluster.matrixonecloud.cn" // modify this
password := "your_password" // modify this
port := 6001
database := "test"
encodedUsername := url.QueryEscape(username)
dsn := encodedUsername + ":" + password + "@tcp(" + host + ":" + strconv.Itoa(port) + ")/" + database
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"
"net/url"
"strconv"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// user model
type USER struct {
ID uint `gorm:"primaryKey"`
CNAME string
CADDRESS string
}
func getDBConn() *gorm.DB {
username := "585b49fc_852b_4bd1_b6d1_d64bc1d8xxxx:admin:accountadmin" // modify this
host := "freetier-01.cn-hangzhou.cluster.matrixonecloud.cn" // modify this
password := "your_password" // modify this
port := 6001
database := "test"
encodedUsername := url.QueryEscape(username)
dsn := encodedUsername + ":" + password + "@tcp(" + host + ":" + strconv.Itoa(port) + ")/" + database
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"
"net/url"
"strconv"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// user model
type USER struct {
ID uint `gorm:"primaryKey"`
CNAME string
CADDRESS string
}
func getDBConn() *gorm.DB {
username := "585b49fc_852b_4bd1_b6d1_d64bc1d8xxxx:admin:accountadmin" // modify this
host := "freetier-01.cn-hangzhou.cluster.matrixonecloud.cn" // modify this
password := "your_password" // modify this
port := 6001
database := "test"
encodedUsername := url.QueryEscape(username)
dsn := encodedUsername + ":" + password + "@tcp(" + host + ":" + strconv.Itoa(port) + ")/" + database
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"
"net/url"
"strconv"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// user model
type USER struct {
ID uint `gorm:"primaryKey"`
CNAME string
CADDRESS string
}
func getDBConn() *gorm.DB {
username := "585b49fc_852b_4bd1_b6d1_d64bc1d8xxxx:admin:accountadmin" // modify this
host := "freetier-01.cn-hangzhou.cluster.matrixonecloud.cn" // modify this
password := "your_password" // modify this
port := 6001
database := "test"
encodedUsername := url.QueryEscape(username)
dsn := encodedUsername + ":" + password + "@tcp(" + host + ":" + strconv.Itoa(port) + ")/" + database
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 官方指南