wx

关注公众号领取Go学习资料

wx

洋葱小店

Golang操作关系型数据库


从事后端开发自然少不了和关系型数据库打交道最常用的比如mysql,sqllite,postgresql。在 Go 标准库中提供了 database/sql 包来访问关系型数据库;下面我们以mysql为例体验一下Go常用的数据库操作:

database/sql

1、连接数据库

  • sql.Open 传入驱动名称和连接参数 返回 *sql.BD 数据库连接和error
  • db.Close() 用于关闭数据库连接
  • db.Ping() 验证到数据库的连接是否仍然有效,
db, err := sql.Open("mysql", "<用户名>:<密码>@tcp(<IP>:<端口号>)/<数据库名>")
if err != nil {
    panic(err.Error())
}
defer db.Close()

pingErr := db.Ping()
if pingErr != nil {
    log.Fatal(pingErr)
}

2、查询数据 接下来先创建一张users表;并写入两条数据;

CREATE TABLE `users`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci;

INSERT INTO `users` VALUES (1, 'Xiaoming', '123@golang.com');
INSERT INTO `users` VALUES (2, 'Zhangsan', '456@golang.com');

接下来执行查询操作;查询全部数据:

  • db.Query() 执行一个返回行的查询,并将结果保存在一个 rows 对象中;使用 rows.Next()rows.Scan() 函数处理结果,并将每一行的数据打印出来。

// 查询数据
rows, err := db.Query("SELECT * FROM users")
if err != nil {
    panic(err.Error())
}
defer rows.Close()
// 处理结果
for rows.Next() {
    var id int
    var name string
    var email string
    err = rows.Scan(&id, &name, &email)
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("ID: %d, Name: %s, Email: %s\n", id, name, email)
}

在使用 database/sql 包时,你需要导入 MySQL 驱动程序。在上面的代码中,我们使用 _ "github.com/go-sql-driver/mysql" 导入了 MySQL 驱动程序。

3、写入一条数据

  • DB.Exec() 执行INSERT语句。检查尝试INSERT时是否出现错误,然后使用Result.LastInsertId检索插入的数据库行的ID。
result, err := db.Exec("INSERT INTO `users` (`name`,`email`) VALUES (?, ?)", "Lilei", "789@golang.com")
if err != nil {
    fmt.Printf("add err: %v", err)
}
lastId, err := result.LastInsertId()
if err != nil {
    fmt.Printf("addAlbum: %v", err)
}
fmt.Println(lastId)

虽然 Go 的 database/sql 包提供了一个基本的 SQL 数据库访问接口,但它并没有提供高级的 ORM(对象关系映射)功能。ORM 是一种将关系型数据库映射到面向对象模型的技术,它可以让开发者使用面向对象的方式来操作数据库,而不必直接编写 SQL 语句。 ORM 可以简化数据库访问和管理,提高开发效率。ORM 提供了以下优点:

  1. 简化 CRUD 操作:ORM 可以自动生成 SQL 语句,使开发者不必手动编写 SQL 语句来进行 CRUD 操作。
  2. 避免 SQL 注入攻击:ORM 可以自动转义 SQL 语句中的特殊字符,避免 SQL 注入攻击。
  3. 提高代码复用性:ORM 可以将数据库访问逻辑封装在模型中,使得代码更加模块化和可复用。
  4. 提供了更多的功能:ORM 可以提供更多的功能,如事务管理、缓存、延迟加载等。

常见的 Go ORM 框架包括 GORM、XORM、Beego ORM 等。这些框架提供了丰富的功能,可以让开发者更加方便地操作数据库。接下来我们看一下GORM 的基本操作。

GORM

The fantastic ORM library for Golang

image.png 1、建立数据库连接 GORM支持MySQL、PostgreSQL、SQLite、SQL Server和TiDB数据库;此处代码已MySQL为例

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

2、创建模型,查询数据 模型是Go结构体类型,结构体字段可以是Go基本类型、指针/别名或实现Scanner和Valuer接口的自定义类型;下面我们定义一个User模型;并使用该模型查询数据

type User struct {
  Id           uint
  Name         string
  Email        *string
}

var user User
err = db.Find(&user).Error
if err != nil {
    panic(err.Error())
}
fmt.Println(user.Id, user.Name, user.Email)

3、写入一条数据

  • db.Create() 写入数据;可以写入单条也可以写入多条数据
new_user := User{Name: "Tommy", Email: "121@mail.com"}
result := db.Create(&new_user)
fmt.Println(
    new_user.Id,
    result.Error,
    result.RowsAffected)

Gorm 支持多种主流的关系型数据库,如 MySQL、PostgreSQL、SQLite 等,提供了丰富的查询语法和链式调用的 API,使得开发者可以快速、方便地进行数据库操作。同时,Gorm 还具有自动迁移、事务处理、预加载等强大的功能,可以大大提高开发效率。更多详细用法可以查阅 Gorm文档 :https://gorm.io/docs/

如有疑问关注公众号给我留言
wx

关注公众号领取Go学习资料

wx

洋葱小店

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo