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 提供了以下优点:
- 简化 CRUD 操作:ORM 可以自动生成 SQL 语句,使开发者不必手动编写 SQL 语句来进行 CRUD 操作。
- 避免 SQL 注入攻击:ORM 可以自动转义 SQL 语句中的特殊字符,避免 SQL 注入攻击。
- 提高代码复用性:ORM 可以将数据库访问逻辑封装在模型中,使得代码更加模块化和可复用。
- 提供了更多的功能:ORM 可以提供更多的功能,如事务管理、缓存、延迟加载等。
常见的 Go ORM 框架包括 GORM、XORM、Beego ORM 等。这些框架提供了丰富的功能,可以让开发者更加方便地操作数据库。接下来我们看一下GORM 的基本操作。
GORM
The fantastic ORM library for Golang
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/
- 《Go 程序设计语言》(Go 语言圣经,机械工业出版社) —— Go 官方团队出品,公认入门第一书
- 《Go 语言实战》(异步图书,人民邮电出版社) —— 实战导向,面试前巩固工程手感
- 《Go 语言编程之旅:一起用 Go 做项目》(博文视点,电子工业出版社) —— 项目驱动入门,从零写出完整应用
- Keychron K1Max 矮轴机械键盘(Mac/Win 双系统,QMK/VIA 开源改键) —— 轻薄矮轴 + 开源固件,程序员桌面常客
- 罗技 MX Master 3S 无线鼠标(Flow 跨屏,静音电磁滚轮) —— 人体工学设计,写代码一整天手不酸
以上链接含京东联盟推广代码;通过链接购买本站可能获得少量佣金,不影响你的购买价格。
每周更新 Go + AI 应用开发实战:AI 面试官完整项目、MCP、Agent 工程化,完整源码随文章首发。
微信扫码,或搜索「GO语言入门之路」关注,第一时间获取系列更新与源码,不再错过任何一篇。