Go语言数据库实战:PostgreSQL与MongoDB

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Go 中处理数据库:PostgreSQL 和 MongoDB



Go (Golang) 是一种现代编译型语言,非常适合构建高负载的后端服务。任何后端的关键任务之一就是处理数据库。在本文中,我们将详细讨论如何连接并执行两种最流行的数据库管理系统(DBMS)的 CRUD 操作:关系型 PostgreSQL 和文档型 MongoDB。您将获得现成的代码示例、最佳实践以及查询优化建议。



1. 环境准备和驱动程序安装



在开始之前,请确保您已安装 Go 1.19 或更高版本。为了处理数据库,我们需要两个主要的包:



  • database/sql — Go 用于处理 SQL 数据库的标准包(通用接口);
  • lib/pq — PostgreSQL 的驱动程序;
  • go.mongodb.org/mongo-driver — MongoDB 的官方驱动程序。


通过 go get 安装驱动程序:



go get github.com/lib/pqgo get go.mongodb.org/mongo-driver/mongo


为您的项目创建一个新模块:



mkdir go-db-examplecd go-db-examplego mod init go-db-example


2. 在 Go 中处理 PostgreSQL



PostgreSQL 是一个强大的对象关系型数据库管理系统。在 Go 中,通过 database/sql 接口与其交互。



2.1 连接数据库



创建一个 main.go 文件并编写连接到本地 Postgres 数据库的代码:



package main

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

_ "github.com/lib/pq")

func main() { // 连接字符串:user password dbname sslmode connStr := "user=postgres password=mysecretpassword dbname=testdb sslmode=disable" db, err := sql.Open("postgres", connStr) if err != nil { log.Fatal("连接错误:", err) } defer db.Close()

// 检查连接 err = db.Ping() if err != nil { log.Fatal("无法连接到数据库:", err) } fmt.Println("成功连接到 PostgreSQL!")}


2.2 创建表并插入数据



连接后,创建一个 users 表并插入几条记录:



// 创建表createTable := `CREATE TABLE IF NOT EXISTS users (    id SERIAL PRIMARY KEY,    name VARCHAR(100) NOT NULL,    email VARCHAR(100) UNIQUE NOT NULL,    age INT);`

_, err = db.Exec(createTable)if err != nil { log.Fatal("创建表错误:", err)}

// 插入数据insert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3)`_, err = db.Exec(insert, "安娜·彼得罗娃", "anna@example.com", 28)if err != nil { log.Fatal("插入错误:", err)}fmt.Println("数据已添加")


2.3 读取数据 (SELECT)



使用 QueryRow 获取单条记录,使用 Query 获取多条记录:



// 获取单条记录var id intvar name, email stringvar age sql.NullInt64

row := db.QueryRow("SELECT id, name, email, age FROM users WHERE email = $1", "anna@example.com")err = row.Scan(&id, &name, &email, &age)if err != nil { log.Fatal("扫描错误:", err)}fmt.Printf("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %v", id, name, email, age)

// 获取所有记录rows, err := db.Query("SELECT id, name, email FROM users ORDER BY id")if err != nil { log.Fatal("查询错误:", err)}defer rows.Close()

for rows.Next() { err := rows.Scan(&id, &name, &email) if err != nil { log.Fatal("读取行错误:", err) } fmt.Printf("用户: %d | %s | %s", id, name, email)}


重要提示: 始终处理 sql.NullInt64 等可为空的字段,以避免在遇到 NULL 值时出现 panic。



3. 在 Go 中处理 MongoDB

博客

书籍推荐