溫馨提示×

Golang在Linux下的數據庫操作指南

小樊
42
2025-08-27 14:31:41
欄目: 編程語言

以下是Golang在Linux下操作數據庫的指南,以MySQL為例,其他數據庫(如PostgreSQL、MongoDB)可參考對應驅動調整。

一、環境準備

  1. 安裝Go環境
    通過包管理器安裝,如Ubuntu/Debian:

    sudo apt update && sudo apt install golang
    

    或手動安裝:Go官方下載。

  2. 安裝數據庫

    • MySQL
      sudo apt install mysql-server
      sudo systemctl start mysql && sudo systemctl enable mysql
      
    • PostgreSQL
      sudo apt install postgresql postgresql-contrib
      sudo service postgresql start
      
  3. 安裝數據庫驅動

    • MySQL驅動
      go get -u github.com/go-sql-driver/mysql
      
    • PostgreSQL驅動
      go get -u github.com/lib/pq
      

二、基礎數據庫操作

1. 連接數據庫

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("數據庫連接成功!")
}

2. CRUD操作

  • 插入數據

    _, 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)
    }
    

三、進階操作

1. 連接池配置

db.SetMaxOpenConns(50)    // 最大打開連接數
db.SetMaxIdleConns(10)    // 最大空閑連接數
db.SetConnMaxLifetime(time.Hour) // 連接最大生命周期

2. 預處理語句

stmt, err := db.Prepare("SELECT * FROM users WHERE age > ?")
if err != nil {
    panic(err)
}
defer stmt.Close()

rows, err := stmt.Query(18)
// 處理結果...

3. 事務處理

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)
}

四、其他數據庫操作

1. PostgreSQL示例

連接字符串示例:

dsn := "user=username password=secret dbname=mydb sslmode=disable"
db, err := sql.Open("postgres", dsn)

2. MongoDB示例(需安裝驅動)

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")
    // 插入、查詢等操作...
}

五、注意事項

  1. 權限管理:確保數據庫用戶有對應權限,生產環境避免使用root賬戶。
  2. 錯誤處理:始終檢查err,避免程序因未捕獲錯誤崩潰。
  3. 資源釋放:使用defer關閉數據庫連接、語句和結果集。
  4. 性能優化:合理配置連接池參數,避免頻繁創建連接。

參考資料:

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女