在Go中使用数据库:面向初学者的PostgreSQL和MongoDB
Go (Golang) 是一种现代编译型语言,因其高性能、简洁性和内置并发支持而广受欢迎。在开发Web服务和应用程序时,几乎总是需要与数据库交互。本文将介绍如何使用两种流行的数据库管理系统:关系型PostgreSQL和文档型MongoDB。本材料面向已经熟悉Go基础知识的初学者开发者。
1. 环境准备和驱动安装
在开始之前,请确保您已安装Go(版本1.16+)并启动了相应的数据库管理系统。使用PostgreSQL需要lib/pq驱动,而MongoDB则需要官方驱动mongo-go-driver。
go get github.com/lib/pqgo get go.mongodb.org/mongo-driver/mongo创建一个新模块:
go mod init example.com/db-demo2. 在Go中使用PostgreSQL
PostgreSQL是一个支持SQL的强大关系型数据库。在Go中,我们使用标准包database/sql配合lib/pq驱动。
2.1 连接数据库
连接时需要指定连接字符串(DSN),格式为:host=... port=... user=... password=... dbname=... sslmode=disable。
package main
import ( "database/sql" "fmt" "log" _ "github.com/lib/pq")
func main() { connStr := "host=localhost port=5432 user=postgres password=secret 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 创建表和CRUD操作
我们来看看如何创建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)}
// 插入数据sqlInsert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING id`var userID interr = db.QueryRow(sqlInsert, "伊万·彼得罗夫", "ivan@example.com", 30).Scan(&userID)if err != nil { log.Fatal(err)}fmt.Printf("已添加用户,ID: %d", userID)
// 查询数据rows, err := db.Query("SELECT id, name, email, age FROM users")if err != nil { log.Fatal(err)}defer rows.Close()
for rows.Next() { var u struct { ID int Name string Email string Age int } err := rows.Scan(&u.ID, &u.Name, &u.Email, &u.Age) if err != nil { log.Fatal(err) } fmt.Printf("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %d", u.ID, u.Name, u.Email, u.Age)}2.3 使用预处理语句
预处理语句(prepared statements)可以提高安全性和性能,特别是在重复操作时。
stmt, err := db.Prepare("UPDATE users SET age = $1 WHERE id = $2")if err != nil { log.Fatal(err)}defer stmt.Close()
_, err = stmt.Exec(35, 1)if err != nil { log.Fatal(err)}fmt.Println("用户年龄已更新")3. 在Go中使用MongoDB
MongoDB是一种文档型NoSQL数据库。在Go中,通过官方驱动mongo-go-driver进行操作,该驱动使用上下文(context)来管理操作执行时间。
3.1 连接MongoDB
pa