Skip to content

database/sql

在 Go 中操作数据库通常使用标准的 database/sql 包和第三方数据库驱动。下面是一些操作数据库的常见步骤和示例:

1. 安装数据库驱动

首先,你需要安装相应的数据库驱动。以 PostgreSQL 为例,可以使用 github.com/lib/pq 驱动。

bash
go get github.com/lib/pq

2. 连接数据库

使用 database/sql 包来创建数据库连接。

go
package main

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

	_ "github.com/lib/pq" // 导入 PostgreSQL 驱动
)

func main() {
	// 连接到 PostgreSQL 数据库
	connStr := "user=username dbname=mydb 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("成功连接到数据库!")
}

3. 执行查询(SELECT)

go
func queryData(db *sql.DB) {
	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
		err := rows.Scan(&id, &name)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("ID: %d, Name: %s\n", id, name)
	}

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

4. 插入数据(INSERT)

go
func insertData(db *sql.DB) {
	_, err := db.Exec("INSERT INTO users(name) VALUES($1)", "Alice")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("插入成功!")
}

5. 更新数据(UPDATE)

go
func updateData(db *sql.DB) {
	_, err := db.Exec("UPDATE users SET name = $1 WHERE id = $2", "Bob", 1)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("更新成功!")
}

6. 删除数据(DELETE)

go
func deleteData(db *sql.DB) {
	_, err := db.Exec("DELETE FROM users WHERE id = $1", 1)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("删除成功!")
}

7. 事务处理

go
func transactionExample(db *sql.DB) {
	tx, err := db.Begin()
	if err != nil {
		log.Fatal(err)
	}

	// 执行多个操作
	_, err = tx.Exec("UPDATE users SET name = $1 WHERE id = $2", "Charlie", 1)
	if err != nil {
		tx.Rollback()
		log.Fatal(err)
	}

	// 提交事务
	err = tx.Commit()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("事务提交成功!")
}

8. 错误处理

Go 中的数据库操作会返回错误,必须检查每个操作的错误并适当处理。

9. 关闭连接

数据库连接通常应该在使用后关闭,通常通过 defer db.Close() 来确保连接在函数结束时关闭。

以上是一些常见的 Go 操作数据库的基本步骤。如果你使用其他数据库(如 MySQL、SQLite 等),只需更换相应的驱动并调整连接字符串。