Go语言生态中go-sqlite3是操作SQLite数据库的主流第三方库,使用它执行SELECT查询获取数据时,需要遵循规范的流程才能保证代码稳定可靠。首先我们需要完成环境准备,确保本地安装了SQLite开发依赖,并且Go环境配置正确。

环境准备与依赖安装
go-sqlite3是CGO依赖的库,需要先安装SQLite的开发包,不同系统安装方式不同:
- Ubuntu/Debian系统执行
sudo apt-get install sqlite3 libsqlite3-dev - macOS系统执行
brew install sqlite - Windows系统需要下载SQLite的预编译开发包并配置环境变量
安装完成后,在Go项目中引入依赖:
// 执行命令安装依赖 // go get github.com/mattn/go-sqlite3
初始化数据库连接
执行SELECT查询前需要先建立数据库连接,go-sqlite3的驱动注册名称为sqlite3,使用sql.Open方法创建连接:
package main
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// 打开或创建SQLite数据库文件,路径为当前目录下的test.db
db, err := sql.Open("sqlite3", "./test.db")
if err != nil {
fmt.Println("数据库连接失败:", err)
return
}
// 延迟关闭数据库连接,释放资源
defer db.Close()
// 验证数据库连接是否正常
err = db.Ping()
if err != nil {
fmt.Println("数据库连接验证失败:", err)
return
}
fmt.Println("数据库连接成功")
}
执行简单SELECT查询
对于没有参数的简单查询,可以使用db.Query方法执行,然后遍历结果集获取数据:
// 假设数据库中已有user表,包含id、name、age三个字段
func queryAllUsers(db *sql.DB) {
// 执行SELECT查询语句
rows, err := db.Query("SELECT id, name, age FROM user")
if err != nil {
fmt.Println("查询失败:", err)
return
}
// 延迟关闭结果集,避免资源泄漏
defer rows.Close()
// 遍历结果集
for rows.Next() {
var id int
var name string
var age int
// 将当前行的字段值映射到变量中
err := rows.Scan(&id, &name, &age)
if err != nil {
fmt.Println("数据解析失败:", err)
return
}
fmt.Printf("用户ID:%d, 姓名:%s, 年龄:%dn", id, name, age)
}
// 检查遍历过程中是否出现错误
if err = rows.Err(); err != nil {
fmt.Println("遍历结果集异常:", err)
}
}
带参数的SELECT查询
实际开发中查询往往带有条件,需要使用参数化查询避免SQL注入风险,go-sqlite3使用?作为占位符:
func queryUserByName(db *sql.DB, targetName string) {
// 参数化查询,?是占位符
rows, err := db.Query("SELECT id, name, age FROM user WHERE name = ?", targetName)
if err != nil {
fmt.Println("查询失败:", err)
return
}
defer rows.Close()
for rows.Next() {
var id int
var name string
var age int
err := rows.Scan(&id, &name, &age)
if err != nil {
fmt.Println("数据解析失败:", err)
return
}
fmt.Printf("匹配用户ID:%d, 姓名:%s, 年龄:%dn", id, name, age)
}
if err = rows.Err(); err != nil {
fmt.Println("遍历结果集异常:", err)
}
}
查询单条记录
如果确定查询结果只有一条记录,可以使用db.QueryRow方法,避免操作结果集的复杂逻辑:
func queryUserByID(db *sql.DB, userID int) {
var id int
var name string
var age int
// QueryRow执行查询,直接调用Scan获取结果
err := db.QueryRow("SELECT id, name, age FROM user WHERE id = ?", userID).Scan(&id, &name, &age)
if err != nil {
if err == sql.ErrNoRows {
fmt.Println("未查询到对应ID的用户")
} else {
fmt.Println("查询失败:", err)
}
return
}
fmt.Printf("查询到的用户ID:%d, 姓名:%s, 年龄:%dn", id, name, age)
}
常见注意事项
- 每次执行查询后都要及时关闭结果集,否则会造成数据库连接资源泄漏,建议搭配
defer使用 - 字段映射时,
Scan方法的参数类型要和数据库字段类型匹配,否则会出现解析错误 - 不要拼接字符串构造查询条件,始终使用参数化查询防止SQL注入
- 遍历完结果集后要检查
rows.Err(),确认遍历过程中没有异常 - 数据库连接的关闭要放在所有查询操作完成之后,避免提前关闭连接导致查询失败
go-sqlite3SELECT查询Go语言SQLite修改时间:2026-06-26 15:42:35