使用 Go 的 database/sql 包进行数据库操作

介绍

在现代应用程序开发中,数据库操作是不可或缺的一部分。Go 语言的标准库提供了 database/sql 包来简化与数据库的交互。这个包为开发者提供了一个统一的接口,可以与多种数据库(如 MySQL、PostgreSQL、SQLite 等)进行连接和操作。

本文将介绍如何使用 database/sql 包进行基本的数据库操作,包括连接数据库、执行查询、插入数据、更新和删除记录等。

安装数据库驱动

在使用 database/sql 之前,您需要安装相应的数据库驱动。这里以 PostgreSQL 为例,您可以使用以下命令安装驱动:

go get github.com/lib/pq

连接数据库

首先,我们需要通过 sql.Open 函数连接到数据库。以下是连接 PostgreSQL 数据库的示例:

package main

import (
    "database/sql"
    "log"

    _ "github.com/lib/pq" // 使用 PostgreSQL 驱动
)

func main() {
    // 数据库连接字符串
    connStr := "user=username dbname=mydb sslmode=disable"
    db, err := sql.Open("postgres", connStr)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 测试连接
    if err = db.Ping(); err != nil {
        log.Fatal(err)
    }
    log.Println("成功连接到数据库")
}

基本的 CRUD 操作

1. 创建(Insert)

要插入数据,可以使用 Exec 方法。以下是插入用户信息的示例:

func createUser(db *sql.DB, name string, age int) error {
    query := "INSERT INTO users (name, age) VALUES (\$1, \$2)"
    _, err := db.Exec(query, name, age)
    return err
}
2. 读取(Select)

获取数据可以使用 QueryQueryRow 方法。QueryRow 用于获取单个结果,Query 用于获取多个结果。

获取单个用户信息:

func getUser(db *sql.DB, id int) (*User, error) {
    query := "SELECT id, name, age FROM users WHERE id = \$1"
    user := &User{}
    err := db.QueryRow(query, id).Scan(&user.ID, &user.Name, &user.Age)
    if err != nil {
        return nil, err
    }
    return user, nil
}

获取所有用户:

func getAllUsers(db *sql.DB) ([]User, error) {
    query := "SELECT id, name, age FROM users"
    rows, err := db.Query(query)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var users []User
    for rows.Next() {
        var user User
        if err := rows.Scan(&user.ID, &user.Name, &user.Age); err != nil {
            return nil, err
        }
        users = append(users, user)
    }
    return users, nil
}
3. 更新(Update)

更新数据同样使用 Exec 方法:

func updateUser(db *sql.DB, id int, name string, age int) error {
    query := "UPDATE users SET name = \$1, age = \$2 WHERE id = \$3"
    _, err := db.Exec(query, name, age, id)
    return err
}
4. 删除(Delete)

删除数据也是通过 Exec 方法:

func deleteUser(db *sql.DB, id int) error {
    query := "DELETE FROM users WHERE id = \$1"
    _, err := db.Exec(query, id)
    return err
}

使用事务

在处理多个数据库操作时,使用事务可以确保数据的一致性。例如,我们可以在创建用户的同时记录日志:

func createUserWithTransaction(db *sql.DB, name string, age int) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }

    // 插入用户
    _, err = tx.Exec("INSERT INTO users (name, age) VALUES (\$1, \$2)", name, age)
    if err != nil {
        tx.Rollback()
        return err
    }

    // 记录日志(假设有一个日志表)
    _, err = tx.Exec("INSERT INTO user_logs (user_name) VALUES (\$1)", name)
    if err != nil {
        tx.Rollback()
        return err
    }

    return tx.Commit()
}

错误处理

if err == sql.ErrNoRows {
    log.Println("没有找到用户")
} else if err != nil {
    log.Fatal(err)
}

猜你喜欢

转载自blog.csdn.net/jhgj56/article/details/143110572