以下是Golang在Linux下操作数据库的指南,以MySQL为例,其他数据库(如PostgreSQL、MongoDB)可参考对应驱动调整。
安装Go环境
通过包管理器安装,如Ubuntu/Debian:
sudo apt update && sudo apt install golang
或手动安装:Go官方下载。
安装数据库
sudo apt install mysql-server
sudo systemctl start mysql && sudo systemctl enable mysql
sudo apt install postgresql postgresql-contrib
sudo service postgresql start
安装数据库驱动
go get -u github.com/go-sql-driver/mysql
go get -u github.com/lib/pq
import (
"database/sql"
_ "github.com/go-sql-driver/mysql" // MySQL驱动
)
func main() {
dsn := "username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True"
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
defer db.Close()
// 测试连接
if err := db.Ping(); err != nil {
panic(err)
}
fmt.Println("数据库连接成功!")
}
插入数据
_, err := db.Exec("INSERT INTO users(name, age) VALUES (?, ?)", "Alice", 25)
if err != nil {
panic(err)
}
查询单行
var name string
err := db.QueryRow("SELECT name FROM users WHERE id = ?", 1).Scan(&name)
if err != nil {
panic(err)
}
fmt.Println("用户名:", name)
查询多行
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
panic(err)
}
fmt.Println(id, name)
}
更新数据
_, err := db.Exec("UPDATE users SET age = ? WHERE id = ?", 30, 1)
if err != nil {
panic(err)
}
删除数据
_, err := db.Exec("DELETE FROM users WHERE id = ?", 1)
if err != nil {
panic(err)
}
db.SetMaxOpenConns(50) // 最大打开连接数
db.SetMaxIdleConns(10) // 最大空闲连接数
db.SetConnMaxLifetime(time.Hour) // 连接最大生命周期
stmt, err := db.Prepare("SELECT * FROM users WHERE age > ?")
if err != nil {
panic(err)
}
defer stmt.Close()
rows, err := stmt.Query(18)
// 处理结果...
tx, err := db.Begin()
if err != nil {
panic(err)
}
defer func() {
if err != nil {
tx.Rollback()
return
}
tx.Commit()
}()
_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", 100, 1)
if err != nil {
panic(err)
}
_, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", 100, 2)
if err != nil {
panic(err)
}
连接字符串示例:
dsn := "user=username password=secret dbname=mydb sslmode=disable"
db, err := sql.Open("postgres", dsn)
import (
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
panic(err)
}
defer client.Disconnect(context.TODO())
collection := client.Database("test").Collection("users")
// 插入、查询等操作...
}
err
,避免程序因未捕获错误崩溃。defer
关闭数据库连接、语句和结果集。参考资料: