【Go语言快速上手】第二部分:Go语言进阶之数据库操作

文章目录

  • 前言:数据库操作
  • [一、使用 `database/sql` 包操作关系型数据库](#一、使用 database/sql 包操作关系型数据库)
    • [1.1 连接数据库](#1.1 连接数据库)
      • [1.1.1 安装 MySQL 驱动](#1.1.1 安装 MySQL 驱动)
      • [1.1.2 连接到 MySQL 数据库](#1.1.2 连接到 MySQL 数据库)
    • [1.2 执行 SQL 查询](#1.2 执行 SQL 查询)
      • [1.2.1 查询单行数据](#1.2.1 查询单行数据)
      • [1.2.2 查询多行数据](#1.2.2 查询多行数据)
    • [1.3 执行 SQL 插入、更新和删除](#1.3 执行 SQL 插入、更新和删除)
      • 插入数据
      • [1.3.1 更新数据](#1.3.1 更新数据)
      • [1.3.2 删除数据](#1.3.2 删除数据)
  • [二、使用 NoSQL 数据库](#二、使用 NoSQL 数据库)
    • [2.1 使用 MongoDB](#2.1 使用 MongoDB)
      • [2.1.1 安装 MongoDB 驱动](#2.1.1 安装 MongoDB 驱动)
      • [2.1.2 连接到 MongoDB 并执行查询](#2.1.2 连接到 MongoDB 并执行查询)
    • [2.2 使用 Redis](#2.2 使用 Redis)
      • [2.2.1 安装 Redis 驱动](#2.2.1 安装 Redis 驱动)
      • [2.2.2 连接到 Redis 并执行操作](#2.2.2 连接到 Redis 并执行操作)

前言:数据库操作

Go 语言通过内置的 database/sql 包支持关系型数据库的操作,同时也支持通过第三方库与 NoSQL 数据库进行交互。你可以通过标准的 SQL 操作与关系型数据库(如 MySQL、PostgreSQL)进行交互,也可以使用专门的库来连接 NoSQL 数据库(如 MongoDB、Redis)。本篇博客将介绍如何在 Go 中操作关系型数据库与 NoSQL 数据库。


一、使用 database/sql 包操作关系型数据库

Go 的 database/sql 包提供了一个统一的接口,允许与多种关系型数据库(如 MySQL、PostgreSQL 等)进行交互。你可以通过 database/sql 包提供的 API 执行 SQL 查询、插入、更新和删除等操作。

1.1 连接数据库

首先,你需要安装并导入适用于数据库的驱动,例如对于 MySQL,你可以使用 github.com/go-sql-driver/mysql 驱动,针对 PostgreSQL,可以使用 github.com/lib/pq

1.1.1 安装 MySQL 驱动

sh 复制代码
go get -u github.com/go-sql-driver/mysql

1.1.2 连接到 MySQL 数据库

go 复制代码
package main

import (
    "fmt"
    "log"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 连接数据库
    dsn := "root:password@tcp(127.0.0.1:3306)/testdb"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 测试数据库连接
    if err := db.Ping(); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Successfully connected to MySQL database")
}

1.2 执行 SQL 查询

执行 SQL 查询时,使用 QueryQueryRow 方法获取数据。

1.2.1 查询单行数据

go 复制代码
package main

import (
    "fmt"
    "log"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dsn := "root:password@tcp(127.0.0.1:3306)/testdb"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 查询单行数据
    var name string
    err = db.QueryRow("SELECT name FROM users WHERE id = ?", 1).Scan(&name)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Name:", name)
}

1.2.2 查询多行数据

go 复制代码
package main

import (
    "fmt"
    "log"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dsn := "root:password@tcp(127.0.0.1:3306)/testdb"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    rows, err := db.Query("SELECT id, name FROM users")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name string
        if err := rows.Scan(&id, &name); err != nil {
            log.Fatal(err)
        }
        fmt.Println(id, name)
    }

    if err := rows.Err(); err != nil {
        log.Fatal(err)
    }
}

1.3 执行 SQL 插入、更新和删除

插入数据

go 复制代码
package main

import (
    "fmt"
    "log"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dsn := "root:password@tcp(127.0.0.1:3306)/testdb"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 插入数据
    result, err := db.Exec("INSERT INTO users(name) VALUES(?)", "Alice")
    if err != nil {
        log.Fatal(err)
    }

    lastInsertID, err := result.LastInsertId()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Inserted record with ID:", lastInsertID)
}

1.3.1 更新数据

go 复制代码
package main

import (
    "fmt"
    "log"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dsn := "root:password@tcp(127.0.0.1:3306)/testdb"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 更新数据
    result, err := db.Exec("UPDATE users SET name = ? WHERE id = ?", "Bob", 1)
    if err != nil {
        log.Fatal(err)
    }

    affectedRows, err := result.RowsAffected()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Affected rows:", affectedRows)
}

1.3.2 删除数据

go 复制代码
package main

import (
    "fmt"
    "log"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dsn := "root:password@tcp(127.0.0.1:3306)/testdb"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 删除数据
    result, err := db.Exec("DELETE FROM users WHERE id = ?", 1)
    if err != nil {
        log.Fatal(err)
    }

    affectedRows, err := result.RowsAffected()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Affected rows:", affectedRows)
}

二、使用 NoSQL 数据库

Go 语言也支持与 NoSQL 数据库进行交互,如 MongoDB 和 Redis。我们将介绍如何使用 Go 操作这两种数据库。

2.1 使用 MongoDB

MongoDB 是一个文档型 NoSQL 数据库,可以通过 go.mongodb.org/mongo-driver 驱动与 MongoDB 进行交互。

2.1.1 安装 MongoDB 驱动

sh 复制代码
go get go.mongodb.org/mongo-driver/mongo

2.1.2 连接到 MongoDB 并执行查询

go 复制代码
package main

import (
    "fmt"
    "log"
    "context"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        log.Fatal(err)
    }
    defer client.Disconnect(context.TODO())

    collection := client.Database("testdb").Collection("users")

    var result map[string]interface{}
    err = collection.FindOne(context.TODO(), map[string]interface{}{"name": "Alice"}).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Found user:", result)
}

2.2 使用 Redis

Redis 是一个键值存储数据库,可以使用 github.com/go-redis/redis/v8 库与 Redis 进行交互。

2.2.1 安装 Redis 驱动

sh 复制代码
go get github.com/go-redis/redis/v8

2.2.2 连接到 Redis 并执行操作

go 复制代码
package main

import (
    "fmt"
    "log"
    "github.com/go-redis/redis/v8"
    "context"
)

func main() {
    rdb := redis.NewClient(&redis.Options{
        Addr: "localhost:6379", // Redis 地址
    })
    ctx := context.Background()

    // 设置键值对
    err := rdb.Set(ctx, "name", "Alice", 0).Err()
    if err != nil {
        log.Fatal(err)
    }

    // 获取键值对
    val, err := rdb.Get(ctx, "name").Result()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("name:", val)
}

相关推荐
Apple_羊先森几秒前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle
无小道10 分钟前
Qt——事件简单介绍
开发语言·前端·qt
devmoon15 分钟前
在 Paseo 测试网上获取 Coretime:On-demand 与 Bulk 的完整实操指南
开发语言·web3·区块链·测试用例·智能合约·solidity
kylezhao201932 分钟前
C# 中的 SOLID 五大设计原则
开发语言·c#
全栈前端老曹37 分钟前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
神梦流1 小时前
ops-math 算子库的扩展能力:高精度与复数运算的硬件映射策略
服务器·数据库
让学习成为一种生活方式1 小时前
trf v4.09.1 安装与使用--生信工具42-version2
数据库
凡人叶枫1 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
啦啦啦_99991 小时前
Redis-5-doFormatAsync()方法
数据库·redis·c#
生产队队长1 小时前
Redis:Windows环境安装Redis,并将 Redis 进程注册为服务
数据库·redis·缓存