数据库操作
1. 数据库驱动与连接
Go使用database/sql标准库操作数据库,需要单独安装驱动:
# MySQL驱动
go get -u github.com/go-sql-driver/mysql
# PostgreSQL驱动
go get -u github.com/lib/pq
import (
"database/sql"
_ "github.com/go-sql-driver/mysql" // 匿名导入,只执行init函数
)
func main() {
// 打开数据库连接
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
panic(err)
}
defer db.Close()
// 验证连接
err = db.Ping()
if err != nil {
panic(err)
}
}
2. 基本CRUD操作
查询单行
type User struct {
ID int
Name string
Age int
}
func getUser(db *sql.DB, id int) (*User, error) {
var user User
err := db.QueryRow("SELECT id, name, age FROM users WHERE id = ?", id).
Scan(&user.ID, &user.Name, &user.Age)
if err != nil {
return nil, err
}
return &user, nil
}
查询多行
func getUsers(db *sql.DB) ([]User, error) {
rows, err := db.Query("SELECT id, name, age 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, &user.Age); err != nil {
return nil, err
}
users = append(users, user)
}
return users, nil
}
插入数据
func createUser(db *sql.DB, user *User) error {
result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)",
user.Name, user.Age)
if err != nil {
return err
}
id, err := result.LastInsertId()
if err != nil {
return err
}
user.ID = int(id)
return nil
}
更新数据
func updateUser(db *sql.DB, user *User) error {
_, err := db.Exec("UPDATE users SET name = ?, age = ? WHERE id = ?",
user.Name, user.Age, user.ID)
return err
}
3. 事务处理
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()
}
4. ORM框架简介
GORM示例
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移
db.AutoMigrate(&Product{})
// 创建记录
db.Create(&Product{Code: "D42", Price: 100})
// 查询记录
var product Product
db.First(&product, "code = ?", "D42")
}
提示:对于简单项目,标准库可能足够;对于复杂项目,考虑使用ORM如GORM。但理解底层SQL操作非常重要。
