文章目录
- 前言:数据库操作
- [一、使用 `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 查询时,使用 Query
或 QueryRow
方法获取数据。
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)
}