最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

啟動(dòng) MySQL:

mysql -u root -p

2. 創(chuàng)建測(cè)試數(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ū)動(dòng)

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

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

代碼實(shí)現(xiàn)

main.go

package main

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

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

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ù)庫連接(并不會(huì)立即建立物理連接)
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatalf("連接數(shù)據(jù)庫失敗: %v", err)
    }
    defer db.Close()

    // 3. 測(cè)試連接是否可用
    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)
    }
}

運(yùn)行結(jié)果

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

go run main.go

輸出:

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

注意事項(xiàng)

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

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

2. 連接池設(shè)置

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

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

3. 錯(cuò)誤處理

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

小結(jié)

  • Go 使用 database/sql 配合 go-sql-driver/mysql 可以方便地連接 MySQL。
  • 連接數(shù)據(jù)庫的關(guān)鍵步驟:安裝驅(qū)動(dòng) → 配置 DSN → 打開連接 → Ping 測(cè)試。
  • 在生產(chǎn)環(huán)境中,要注意連接池、錯(cuò)誤處理、以及防止 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ū)動(dòng)

如果還沒安裝:

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

代碼實(shí)現(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()
}

運(yùn)行結(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

注意事項(xiàng)

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

2. 錯(cuò)誤處理查詢、更新、插入、刪除時(shí)都應(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ū)動(dòng)可以很方便地執(zhí)行 CRUD 操作。
  • 推薦使用參數(shù)化查詢,避免 SQL 注入。
  • 在生產(chǎn)中,要結(jié)合事務(wù)、連接池和錯(cuò)誤重試機(jī)制,確保數(shù)據(jù)安全性與穩(wěn)定性。

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

相關(guān)文章

  • Go語言中interface語法與使用詳解

    Go語言中interface語法與使用詳解

    Go語言里面設(shè)計(jì)最精妙的應(yīng)該算interface,它讓面向?qū)ο?內(nèi)容組織實(shí)現(xiàn)非常的方便,下面這篇文章主要給大家介紹了關(guān)于Go語言中interface語法與使用的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例

    golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例

    這篇文章主要介紹了golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言字符串基礎(chǔ)示例詳解

    Go語言字符串基礎(chǔ)示例詳解

    這篇文章主要為大家介紹了Go語言字符串基礎(chǔ)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • 一文帶你搞懂golang中內(nèi)存分配逃逸分析

    一文帶你搞懂golang中內(nèi)存分配逃逸分析

    這篇文章主要帶大家一起學(xué)習(xí)一下golang中內(nèi)存分配逃逸分析,文中的示例代碼講解詳細(xì),對(duì)我們深入了解golang有一定的幫助,感興趣的小伙伴可以了解下
    2023-08-08
  • Golang: 內(nèi)建容器的用法

    Golang: 內(nèi)建容器的用法

    這篇文章主要介紹了Golang: 內(nèi)建容器的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 基于Golang開發(fā)一個(gè)輕量級(jí)登錄庫/框架

    基于Golang開發(fā)一個(gè)輕量級(jí)登錄庫/框架

    幾乎每個(gè)項(xiàng)目都會(huì)有登錄,退出等用戶功能,而登錄又不單僅僅是登錄,我們要考慮很多東西。所以本文就來用Golang開發(fā)一個(gè)輕量級(jí)登錄庫/框架吧
    2023-05-05
  • Golang多線程排序?qū)崿F(xiàn)快速高效地處理大規(guī)模數(shù)據(jù)

    Golang多線程排序?qū)崿F(xiàn)快速高效地處理大規(guī)模數(shù)據(jù)

    Golang多線程排序是一種快速高效地處理大規(guī)模數(shù)據(jù)的方法,通過使用Golang的協(xié)程和通道,可以將排序任務(wù)分配到多個(gè)線程中并行處理,提高了排序的效率和速度,需要詳細(xì)了解可以參考下文
    2023-05-05
  • Go語言實(shí)現(xiàn)熱更新具體步驟

    Go語言實(shí)現(xiàn)熱更新具體步驟

    這篇文章主要為大家介紹了Go語言實(shí)現(xiàn)熱更新具體步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 一文讓你理解go語言的Context

    一文讓你理解go語言的Context

    在Go語言中,Context(上下文)是一個(gè)類型,用于在程序中傳遞請(qǐng)求范圍的值、截止時(shí)間、取消信號(hào)和其他與請(qǐng)求相關(guān)的上下文信息,它在多個(gè)goroutine之間傳遞這些值,使得并發(fā)編程更加可靠和簡(jiǎn)單,本文詳細(xì)介紹go語言的Context,需要的朋友可以參考下
    2023-05-05
  • 詳解golang?defer?閉包?匿名函數(shù)

    詳解golang?defer?閉包?匿名函數(shù)

    這篇文章主要介紹了golang?defer?閉包?匿名函數(shù)的相關(guān)知識(shí),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

尉氏县| 高安市| 呼图壁县| 中山市| 罗平县| 武鸣县| 兖州市| 利川市| 泸州市| 伊川县| 云梦县| 苍梧县| 洛宁县| 多伦县| 西林县| 临朐县| 陈巴尔虎旗| 南开区| 凭祥市| 平定县| 长顺县| 泗阳县| 阜平县| 彭阳县| 建湖县| 丹巴县| 当阳市| 嘉义县| 磴口县| 都江堰市| 西贡区| 吉首市| 厦门市| 仁化县| 社旗县| 左云县| 靖宇县| 宜川县| 湘潭市| 鹤峰县| 慈溪市|