在Go语言中,使用标准库 database/sql 进行数据库操作,通常配合特定数据库驱动(如MySQL的 github.com/go-sql-driver/mysql)。以下是基本操作步骤和示例代码:
1. 安装驱动
go get -u github.com/go-sql-driver/mysql
2. 连接数据库
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
)
func main() {
// 数据源名称格式: "用户名:密码@协议(地址:端口)/数据库名"
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/testdb")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 验证连接
err = db.Ping()
if err != nil {
log.Fatal("数据库连接失败:", err)
}
log.Println("数据库连接成功")
}
3. 执行查询
type User struct {
ID int
Name string
}
// 查询单条记录
func queryUser(db *sql.DB, id int) (*User, error) {
var user User
err := db.QueryRow("SELECT id, name FROM users WHERE id = ?", id).Scan(&user.ID, &user.Name)
if err != nil {
return nil, err
}
return &user, nil
}
// 查询多条记录
func queryUsers(db *sql.DB) ([]User, error) {
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
return nil, err
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
if err := rows.Scan(&user.ID, &user.Name); err != nil {
return nil, err
}
users = append(users, user)
}
return users, nil
}
4. 执行写入操作
// 插入数据
func insertUser(db *sql.DB, name string) (int64, error) {
result, err := db.Exec("INSERT INTO users (name) VALUES (?)", name)
if err != nil {
return 0, err
}
return result.LastInsertId()
}
// 更新数据
func updateUser(db *sql.DB, id int, name string) error {
_, err := db.Exec("UPDATE users SET name = ? WHERE id = ?", name, id)
return err
}
// 删除数据
func deleteUser(db *sql.DB, id int) error {
_, err := db.Exec("DELETE FROM users WHERE id = ?", id)
return err
}
5. 事务处理
func transferMoney(db *sql.DB, from, to int, amount float64) error {
tx, err := db.Begin()
if err != nil {
return err
}
// 执行转账操作
_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, from)
if err != nil {
tx.Rollback()
return err
}
_, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, to)
if err != nil {
tx.Rollback()
return err
}
return tx.Commit()
}
关键要点:
- 使用
sql.Open() 初始化连接(实际连接在需要时建立)
- 始终检查错误并处理
defer rows.Close()
- 使用预处理语句防止SQL注入
- 事务操作确保数据一致性
- 连接池由
database/sql 自动管理
建议使用结构体标签或ORM库(如GORM)简化复杂操作,但理解原生SQL操作对性能优化和问题排查很重要。