引言:为什么 Go 语言和数据库是完美搭档
Go(Golang)是一种编译型、静态类型的语言,专为高性能和易开发而设计。Go 语言的关键优势之一在于其丰富的标准库以及与数据库交互的驱动生态。在本文中,我们将详细讲解如何连接并操作两种最流行的数据库管理系统(DBMS):关系型 PostgreSQL 和文档型 MongoDB。
我们将涵盖驱动安装、编写 CRUD 操作(创建、读取、更新、删除),以及在 Go 应用程序中使用每种数据库的最佳实践。
1. 在 Go 中使用 PostgreSQL
PostgreSQL 是一个强大的开源对象关系型 DBMS。Go 中有多个驱动可用于操作它,但最流行的是 lib/pq 和 pgx。pgx 更新且性能更高,因此我们将使用它。
1.1. 安装驱动
使用 go get 安装 pgx 包:
go get github.com/jackc/pgx/v51.2. 连接数据库
让我们创建一个 main.go 文件并建立到 PostgreSQL 的连接。注意使用了 context(context.Background())——这是 Go 中管理请求生命周期的标准模式。
package main
import ( "context" "fmt" "log"
"github.com/jackc/pgx/v5/pgxpool")
func main() { // 连接字符串:postgres://用户名:密码@主机:端口/数据库名 connString := "postgres://user:password@localhost:5432/mydb" // 创建连接池(推荐用于生产环境) pool, err := pgxpool.New(context.Background(), connString) if err != nil { log.Fatal("创建连接池失败:", err) } defer pool.Close() // 检查连接 err = pool.Ping(context.Background()) if err != nil { log.Fatal("数据库连接失败:", err) } fmt.Println("成功连接到 PostgreSQL!")}1.3. 执行 SQL 查询(CRUD)
让我们以 users 表为例,看看基本操作。
创建表(CREATE)
// 执行 DDL 查询_, err = pool.Exec(context.Background(), ` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT )`)if err != nil { log.Fatal("创建表时出错:", err)}插入数据(INSERT)
// 插入并返回 IDvar userID interr = pool.QueryRow(context.Background(), "INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING id", "Alexey", "alex@example.com", 30).Scan(&userID)if err != nil { log.Fatal("插入时出错:", err)}fmt.Printf("已添加用户,ID:%d", userID)读取数据(SELECT)
// 获取单个用户type User struct { ID int Name string Email string Age int}
var user Usererr = pool.QueryRow(context.Background(), "SELECT id, name, email, age FROM users WHERE id = $1", 1). Scan(&user.ID, &user.Name, &user.Email, &user.Age)if err != nil { log.Fatal("未找到用户:", err)}fmt.Printf("已找到:%+v", user)更新和删除(UPDATE/DELETE)
// 更新_, err = pool.Exec(context.Background(), "UPDATE users SET age = $1 WHERE id = $2", 31, 1)
// 删除_, err = pool.Exec(context.Background(), "DELETE FROM users WHERE id = $1", 1)2. 在 Go 中使用 MongoDB
MongoDB 是领先的 NoSQL 数据库,用于存