欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言連接MySQL數(shù)據(jù)庫執(zhí)行基本的增刪改查

 更新時間:2025年08月17日 08:46:53   作者:程序員愛釣魚  
在后端開發(fā)中,MySQL?是最常用的關(guān)系型數(shù)據(jù)庫之一,本文主要為大家詳細介紹了如何使用?Go?連接?MySQL?數(shù)據(jù)庫并執(zhí)行基本的增刪改查吧

在后端開發(fā)中,MySQL 是最常用的關(guān)系型數(shù)據(jù)庫之一。Go 語言通過官方的 database/sql 包和 MySQL 驅(qū)動,可以方便地與 MySQL 建立連接,并執(zhí)行增刪改查操作。

本篇將帶你從零開始,使用 Go 連接 MySQL 數(shù)據(jù)庫,并驗證連接是否成功。

Go語言連接MySQL數(shù)據(jù)庫

準(zhǔn)備工作

1. 安裝 MySQL

如果你本地還沒有 MySQL,可以通過以下方式安裝:

  • Windows/Mac 用戶:從 MySQL 官方網(wǎng)站 下載并安裝。
  • Linux 用戶:
sudo apt install mysql-server     # Debian/Ubuntu
sudo yum install mysql-server     # CentOS

啟動 MySQL:

mysql -u root -p

2. 創(chuàng)建測試數(shù)據(jù)庫與表

登錄 MySQL 后執(zhí)行:

CREATE DATABASE go_demo;
USE go_demo;

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT
);

INSERT INTO users (name, age) VALUES
('Alice', 25),
('Bob', 30);

安裝 MySQL 驅(qū)動

Go 并沒有內(nèi)置 MySQL 驅(qū)動,需要安裝第三方驅(qū)動 go-sql-driver/mysql

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

代碼實現(xiàn)

main.go

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql" // MySQL 驅(qū)動
)

func main() {
    // 1. 定義 MySQL DSN(數(shù)據(jù)源名稱)
    dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"

    // 2. 打開數(shù)據(jù)庫連接(并不會立即建立物理連接)
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatalf("連接數(shù)據(jù)庫失敗: %v", err)
    }
    defer db.Close()

    // 3. 測試連接是否可用
    if err := db.Ping(); err != nil {
        log.Fatalf("無法連接到數(shù)據(jù)庫: %v", err)
    }
    fmt.Println("成功連接到 MySQL 數(shù)據(jù)庫!")

    // 4. 查詢數(shù)據(jù)
    rows, err := db.Query("SELECT id, name, age FROM users")
    if err != nil {
        log.Fatalf("查詢失敗: %v", err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name string
        var age int
        if err := rows.Scan(&id, &name, &age); err != nil {
            log.Fatalf("讀取數(shù)據(jù)失敗: %v", err)
        }
        fmt.Printf("用戶ID:%d, 姓名:%s, 年齡:%d\n", id, name, age)
    }
}

運行結(jié)果

假設(shè)我們已經(jīng)啟動了 MySQL 并且數(shù)據(jù)已插入,執(zhí)行:

go run main.go

輸出:

成功連接到 MySQL 數(shù)據(jù)庫!
用戶ID:1, 姓名:Alice, 年齡:25
用戶ID:2, 姓名:Bob, 年齡:30

注意事項

1. DSN 格式username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local

  • parseTime=True 讓 MySQL 日期類型自動解析為 time.Time
  • charset=utf8mb4 支持 Emoji 等多字節(jié)字符。

2. 連接池設(shè)置

在生產(chǎn)環(huán)境中應(yīng)設(shè)置連接池:

db.SetMaxOpenConns(10) // 最大連接數(shù)
db.SetMaxIdleConns(5)  // 最大空閑連接數(shù)

3. 錯誤處理

每次執(zhí)行查詢或?qū)懭氩僮鲿r,都要檢查 err。

小結(jié)

  • Go 使用 database/sql 配合 go-sql-driver/mysql 可以方便地連接 MySQL。
  • 連接數(shù)據(jù)庫的關(guān)鍵步驟:安裝驅(qū)動 → 配置 DSN → 打開連接 → Ping 測試。
  • 在生產(chǎn)環(huán)境中,要注意連接池、錯誤處理、以及防止 SQL 注入(使用 Prepare 或參數(shù)化查詢)。

Go語言執(zhí)行基本的增刪改查

準(zhǔn)備工作

數(shù)據(jù)庫與表

假設(shè)我們已經(jīng)創(chuàng)建好數(shù)據(jù)庫和表(go_demo 數(shù)據(jù)庫中的 users 表):

CREATE DATABASE go_demo;
USE go_demo;

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT
);

安裝 MySQL 驅(qū)動

如果還沒安裝:

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

代碼實現(xiàn)

main.go

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func initDB() {
    var err error
    dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"
    db, err = sql.Open("mysql", dsn)
    if err != nil {
        log.Fatalf("連接數(shù)據(jù)庫失敗: %v", err)
    }

    if err := db.Ping(); err != nil {
        log.Fatalf("無法連接到數(shù)據(jù)庫: %v", err)
    }
    fmt.Println("數(shù)據(jù)庫連接成功!")
}

// Create - 插入數(shù)據(jù)
func createUser(name string, age int) {
    result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", name, age)
    if err != nil {
        log.Fatalf("插入數(shù)據(jù)失敗: %v", err)
    }
    id, _ := result.LastInsertId()
    fmt.Printf("新增用戶成功,ID = %d\n", id)
}

// Read - 查詢數(shù)據(jù)
func getUsers() {
    rows, err := db.Query("SELECT id, name, age FROM users")
    if err != nil {
        log.Fatalf("查詢失敗: %v", err)
    }
    defer rows.Close()

    fmt.Println("用戶列表:")
    for rows.Next() {
        var id, age int
        var name string
        if err := rows.Scan(&id, &name, &age); err != nil {
            log.Fatalf("讀取數(shù)據(jù)失敗: %v", err)
        }
        fmt.Printf("ID: %d, 姓名: %s, 年齡: %d\n", id, name, age)
    }
}

// Update - 更新數(shù)據(jù)
func updateUser(id int, newAge int) {
    result, err := db.Exec("UPDATE users SET age = ? WHERE id = ?", newAge, id)
    if err != nil {
        log.Fatalf("更新數(shù)據(jù)失敗: %v", err)
    }
    rowsAffected, _ := result.RowsAffected()
    fmt.Printf("更新完成,影響行數(shù): %d\n", rowsAffected)
}

// Delete - 刪除數(shù)據(jù)
func deleteUser(id int) {
    result, err := db.Exec("DELETE FROM users WHERE id = ?", id)
    if err != nil {
        log.Fatalf("刪除數(shù)據(jù)失敗: %v", err)
    }
    rowsAffected, _ := result.RowsAffected()
    fmt.Printf("刪除完成,影響行數(shù): %d\n", rowsAffected)
}

func main() {
    initDB()

    // 增
    createUser("Alice", 25)
    createUser("Bob", 30)

    // 查
    getUsers()

    // 改
    updateUser(1, 26)

    // 查
    getUsers()

    // 刪
    deleteUser(2)

    // 查
    getUsers()
}

運行結(jié)果

假設(shè)我們執(zhí)行:

go run main.go

輸出可能是:

數(shù)據(jù)庫連接成功!
新增用戶成功,ID = 1
新增用戶成功,ID = 2
用戶列表:
ID: 1, 姓名: Alice, 年齡: 25
ID: 2, 姓名: Bob, 年齡: 30
更新完成,影響行數(shù): 1
用戶列表:
ID: 1, 姓名: Alice, 年齡: 26
ID: 2, 姓名: Bob, 年齡: 30
刪除完成,影響行數(shù): 1
用戶列表:
ID: 1, 姓名: Alice, 年齡: 26

注意事項

1. 參數(shù)化查詢使用 ? 占位符,可以有效防止 SQL 注入。

2. 錯誤處理查詢、更新、插入、刪除時都應(yīng)檢查 err

3. 連接池在生產(chǎn)環(huán)境中,建議配置連接池:

db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)

4. 事務(wù)支持如果多條 SQL 需要保證原子性,應(yīng)使用 db.Begin() 開啟事務(wù)。

小結(jié)

  • Go 使用 database/sql + MySQL 驅(qū)動可以很方便地執(zhí)行 CRUD 操作。
  • 推薦使用參數(shù)化查詢,避免 SQL 注入。
  • 在生產(chǎn)中,要結(jié)合事務(wù)、連接池和錯誤重試機制,確保數(shù)據(jù)安全性與穩(wěn)定性。

到此這篇關(guān)于Go語言連接MySQL數(shù)據(jù)庫執(zhí)行基本的增刪改查的文章就介紹到這了,更多相關(guān)Go連接MySQL執(zhí)行增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go基于GORM 獲取當(dāng)前請求所執(zhí)行的 SQL 信息(思路詳解)

    Go基于GORM 獲取當(dāng)前請求所執(zhí)行的 SQL 信息(思路詳解)

    這篇文章主要介紹了Go基于GORM 獲取當(dāng)前請求所執(zhí)行的 SQL 信息(思路詳解),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 在Go中動態(tài)替換SQL查詢中的日期參數(shù)的完整步驟

    在Go中動態(tài)替換SQL查詢中的日期參數(shù)的完整步驟

    在處理數(shù)據(jù)庫查詢時,經(jīng)常需要根據(jù)不同的輸入條件動態(tài)地構(gòu)造SQL語句,尤其是在涉及日期范圍的查詢中,能夠根據(jù)實際需求調(diào)整查詢的起始和結(jié)束日期顯得尤為重要,在本文中,我將介紹如何在Go語言中實現(xiàn)動態(tài)替換SQL查詢中的日期參數(shù),需要的朋友可以參考下
    2024-11-11
  • go實現(xiàn)一個分布式限流器的方法步驟

    go實現(xiàn)一個分布式限流器的方法步驟

    項目中需要對api的接口進行限流,本文主要介紹了go實現(xiàn)一個分布式限流器的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 適合PHP同學(xué)的GoFrame框架使用體驗及學(xué)習(xí)建議

    適合PHP同學(xué)的GoFrame框架使用體驗及學(xué)習(xí)建議

    這篇文章主要為大家介紹了非常適合PHP同學(xué)使用的GoFrame框架設(shè)計思想使用體驗及學(xué)習(xí)建議介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • golang如何實現(xiàn)抓取IP地址的蜘蛛程序詳解

    golang如何實現(xiàn)抓取IP地址的蜘蛛程序詳解

    這篇文章主要給大家介紹了關(guān)于利用golang如何實現(xiàn)抓取IP地址的蜘蛛程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Mac上Go環(huán)境和VS Code的正確安裝與配置方法

    Mac上Go環(huán)境和VS Code的正確安裝與配置方法

    Go語言是一個新興的語言。下面介紹一下如何在Mac系統(tǒng)下安裝和使用這個語言,Go語言提供了mac下安裝包,可直接下載安裝包點擊安裝
    2018-03-03
  • Go項目與Docker結(jié)合實現(xiàn)高效部署深入探究

    Go項目與Docker結(jié)合實現(xiàn)高效部署深入探究

    在現(xiàn)代軟件開發(fā)中,使用Docker部署應(yīng)用程序已經(jīng)成為一種標(biāo)準(zhǔn)實踐,本文將深入探討如何將Go項目與Docker結(jié)合,實現(xiàn)高效、可靠的部署過程,通過詳細的步驟和豐富的示例,你將能夠迅速掌握這一流程
    2023-12-12
  • Go語言常用字符串處理方法實例匯總

    Go語言常用字符串處理方法實例匯總

    這篇文章主要介紹了Go語言常用字符串處理方法,實例匯總了Go語言中常見的各種字符串處理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 解析Golang中引用類型是否進行引用傳遞

    解析Golang中引用類型是否進行引用傳遞

    這篇文章主要為大家介紹了Golang中引用類型是否進行引用傳遞剖析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • go語言使用Casbin實現(xiàn)角色的權(quán)限控制

    go語言使用Casbin實現(xiàn)角色的權(quán)限控制

    Casbin是用于Golang項目的功能強大且高效的開源訪問控制庫。本文主要介紹了go語言使用Casbin實現(xiàn)角色的權(quán)限控制,感興趣的可以了解下
    2021-06-06

最新評論