將 MySQL 安裝在 Docker 中,並使用 Golang 操作 MySQL 的指南

將 MySQL 安裝在 Docker 中,並使用 Golang 操作 MySQL 的指南。



步驟 1:在 Docker 中安裝 MySQL

1. 建立 docker-compose.yml 文件

version: "3.8"
services: mysql: image: mysql:8.0 container_name: mysql_container ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: testdb MYSQL_USER: testuser MYSQL_PASSWORD: testpassword volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:

2. 啟動 MySQL

執行以下命令啟動 MySQL 容器:

docker-compose up -d

3. 驗證 MySQL 啟動

連線到 MySQL:

docker exec -it mysql_container mysql -u root -p

輸入密碼(rootpassword),即可進入 MySQL。



步驟 2:在 Golang 中操作 MySQL


1. 安裝 MySQL 的 Golang 驅動

使用 Go 的官方 MySQL 驅動 github.com/go-sql-driver/mysql

go get -u github.com/go-sql-driver/mysql

2. 建立 Golang 程式

以下是一個完整的範例,包括連線、插入資料、查詢資料等操作。

package main
import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { // 1. 連線到 MySQL dsn := "testuser:testpassword@tcp(127.0.0.1:3306)/testdb" db, err := sql.Open("mysql", dsn) if err != nil { log.Fatalf("Error opening database: %v", err) } defer db.Close() // 2. 測試連線 err = db.Ping() if err != nil { log.Fatalf("Error pinging database: %v", err) } fmt.Println("Successfully connected to MySQL!") // 3. 建立資料表 createTableSQL := ` CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(50) NOT NULL UNIQUE ); ` _, err = db.Exec(createTableSQL) if err != nil { log.Fatalf("Error creating table: %v", err) } fmt.Println("Table `users` created or already exists.") // 4. 插入資料 insertSQL := "INSERT INTO users (name, email) VALUES (?, ?)" result, err := db.Exec(insertSQL, "John Doe", "john.doe@example.com") if err != nil { log.Fatalf("Error inserting data: %v", err) } lastInsertID, _ := result.LastInsertId() fmt.Printf("Inserted data with ID: %d\n", lastInsertID) // 5. 查詢資料 rows, err := db.Query("SELECT id, name, email FROM users") if err != nil { log.Fatalf("Error querying data: %v", err) } defer rows.Close() fmt.Println("Users in the database:") for rows.Next() { var id int var name, email string if err := rows.Scan(&id, &name, &email); err != nil { log.Fatalf("Error scanning row: %v", err) } fmt.Printf("ID: %d, Name: %s, Email: %s\n", id, name, email) } // 6. 關閉資料庫連線(在 defer 已經執行) fmt.Println("Closing database connection.") }


步驟 3:執行程式

1. 啟動 MySQL

確保 MySQL 容器已啟動:

docker-compose up -d

2. 執行 Go 程式

執行範例程式:

go run main.go


程式解說

  1. 連線到 MySQL

    • sql.Open(driverName, dataSourceName):使用 MySQL 驅動建立連線。
    • dsn 的格式為:
      username:password@protocol(address)/dbname
      範例:testuser:testpassword@tcp(127.0.0.1:3306)/testdb
  2. 測試連線

    • db.Ping():測試連線是否可用。
  3. 建立資料表

    • db.Exec(sql):執行 SQL 語句。
  4. 插入資料

    • 使用帶有參數的 SQL 語句避免 SQL Injection。
  5. 查詢資料

    • db.Query(sql):執行查詢語句。
    • rows.Scan():將結果掃描到變數中。
  6. 關閉連線

    • 使用 defer db.Close() 確保程式結束時關閉資料庫連線。


常見問題排除

  1. 無法連線到 MySQL

    • 確保 Docker 容器正確啟動,並檢查 docker ps 是否有 MySQL 容器運行。
    • 確保 MySQL 開放了 3306 埠,並且 dsn 配置正確。
  2. SQL 語句錯誤

    • 檢查 SQL 語句是否正確,例如資料表名稱、字段名稱。
  3. 權限問題

    • 確保在 docker-compose.yml 中定義的用戶和密碼正確。


留言

這個網誌中的熱門文章

[Kotlin]如何學習Kotlin

[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)

[Kotlin]Kotlin Multiplatform (KMP) 如何安裝使用和部署