导航菜单

Go语言/数据库操作
课程进度 79% · 第19/23章19/23章 · 标签 1/4
1

数据库基础

Go常用database/sql标准库操作MySQL、PostgreSQL、SQLite等主流数据库。

  • 需安装对应驱动,如github.com/go-sql-driver/mysql、github.com/lib/pq等
  • 支持原生SQL、事务、预处理、连接池等

连接与配置

以MySQL为例,演示数据库连接与配置:

go
1
import (
2
"database/sql"
3
_ "github.com/go-sql-driver/mysql"
4
)
5
 
6
func main() {
7
dsn := "user:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True"
8
db, err := sql.Open("mysql", dsn)
9
if err != nil { panic(err) }
10
defer db.Close()
11
// 设置最大连接数
12
db.SetMaxOpenConns(10)
13
db.SetMaxIdleConns(5)
14
db.SetConnMaxLifetime(time.Hour)
15
}
  • DSN格式:user:password@tcp(host:port)/dbname
  • 建议设置连接池参数
2

CRUD操作

演示原生SQL的增删改查:

go
1
// 插入数据
2
stmt, _ := db.Prepare("INSERT INTO users(name, age) VALUES(?, ?)")
3
res, err := stmt.Exec("Tom", 20)
4
id, _ := res.LastInsertId()
5
 
6
// 查询单条
7
var name string
8
err := db.QueryRow("SELECT name FROM users WHERE id=?", id).Scan(&name)
9
 
10
// 查询多条
11
rows, _ := db.Query("SELECT id, name FROM users")
12
defer rows.Close()
13
for rows.Next() {
14
var id int
15
var name string
16
rows.Scan(&id, &name)
17
fmt.Println(id, name)
18
}
19
 
20
// 更新
21
db.Exec("UPDATE users SET age=? WHERE id=?", 21, id)
22
 
23
// 删除
24
db.Exec("DELETE FROM users WHERE id=?", id)
  • 推荐使用Prepare防SQL注入
  • QueryRow/Query/Exec分别用于查一条、多条、执行
sql.OpenDSN连接池CRUDPrepare