以下是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
關閉數據庫連接、語句和結果集。參考資料: