数据库操作
Go 的数据库访问分为两个层次:标准库 database/sql 提供统一的驱动接口(手写 SQL),ORM 库(以 GORM 为代表)在其上提供对象映射。本章介绍两者的核心用法。
database/sql:标准接口
database/sql 定义了连接池与查询接口,由各数据库驱动实现。以 PostgreSQL 为例:
增删改查与事务
Warning
必须使用参数占位符($1、? 视数据库而定)传入变量,严禁用 fmt.Sprintf 拼接 SQL,否则存在 SQL 注入风险。
rows.Next() 循环结束后务必检查 rows.Err();rows 与 tx 都要用 defer 释放。
GORM:全功能 ORM
GORM 是 Go 生态最流行的 ORM,支持自动迁移、关联、钩子等能力。
定义模型与连接
增删改查
:::tip GORM 要点:
First/Take/Last找不到记录时返回gorm.ErrRecordNotFound,业务代码应处理该错误。- 结构体方式的
Updates跳过零值字段,更新零值请使用 map 或Select指定列。 - 软删除记录可用
Unscoped()查询:db.Unscoped().Find(&products)。 :::
选型建议
小结
database/sql是统一接口:注意 Ping、ErrNoRows、rows.Close 与事务模板。- GORM 通过模型定义与链式 API 简化 CRUD,默认软删除,零值更新需用 map。
- SQL 一律参数化,连接配置走 DSN 与环境变量。