在Golang中如何正确使用database/sql包进行数据库连接和操作?

在Golang中如何正确使用database/sql包进行数据库连接和操作?特别是想了解:

  1. 连接MySQL/PostgreSQL时的最佳实践是什么?
  2. 如何高效执行CRUD操作,能否给出具体代码示例?
  3. 事务处理应该注意哪些关键点?
  4. 连接池配置有哪些重要参数需要调整?
  5. 常见的错误处理模式有哪些? 最近项目需要用到数据库操作,官方文档看得有点懵,希望有实际开发经验的朋友能分享些实战技巧和避坑指南。
3 回复

以下是一个简单的Golang操作MySQL的实战教程:

  1. 安装依赖
    使用go get命令安装database/sql和MySQL驱动:

    go get -u github.com/go-sql-driver/mysql
    
  2. 连接数据库
    创建一个main.go文件,初始化数据库连接:

    package main
    
    import (
        "database/sql"
        _ "github.com/go-sql-driver/mysql"
        "fmt"
    )
    
    func main() {
        db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/dbname")
        if err != nil {
            fmt.Println("Error:", err)
            return
        }
        defer db.Close()
        fmt.Println("Connected to database!")
    }
    
  3. 执行查询
    查询数据并遍历结果:

    rows, err := db.Query("SELECT id, name FROM users")
    if err != nil {
        fmt.Println("Query error:", err)
        return
    }
    defer rows.Close()
    
    for rows.Next() {
        var id int
        var name string
        rows.Scan(&id, &name)
        fmt.Printf("ID: %d, Name: %s\n", id, name)
    }
    
  4. 插入数据
    执行插入语句:

    stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
    if err != nil {
        fmt.Println("Prepare error:", err)
        return
    }
    defer stmt.Close()
    
    res, err := stmt.Exec("John Doe")
    if err != nil {
        fmt.Println("Insert error:", err)
        return
    }
    lastId, _ := res.LastInsertId()
    fmt.Println("Inserted ID:", lastId)
    
  5. 运行程序
    确保MySQL服务已启动,用户名、密码和数据库名正确。运行:

    go run main.go
    

通过以上步骤,可以完成基本的数据库增删改查操作。根据需求进一步封装数据库操作工具类,提高代码复用性。

更多关于在Golang中如何正确使用database/sql包进行数据库连接和操作?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


作为一个屌丝程序员,我推荐你从基础开始学Go语言的数据库操作。首先确保安装好database/sql包,这是Go的标准库,用于执行SQL语句和处理结果集。

  1. 连接数据库:使用第三方驱动如github.com/go-sql-driver/mysql连接MySQL。代码示例:

    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    
  2. 执行查询:使用db.Query执行带参数的查询。例如:

    rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 18)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    
    for rows.Next() {
        var id int
        var name string
        rows.Scan(&id, &name)
        fmt.Println(id, name)
    }
    
  3. 事务处理:通过db.Begin()开启事务,并用tx.Commit()tx.Rollback()管理事务状态。

  4. 错误处理:始终检查并妥善处理错误,保证程序健壮性。

  5. ORM工具:若觉得手写SQL繁琐,可以考虑使用GORM等ORM框架简化开发。

以上就是Go语言数据库操作的基本流程,希望对你有所帮助!

Golang数据库操作实战教程

连接数据库

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	// 连接MySQL数据库
	db, err := sql.Open("mysql", "用户名:密码@tcp(127.0.0.1:3306)/数据库名")
	if err != nil {
		panic(err.Error())
	}
	defer db.Close()

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

基本CRUD操作

查询数据

type User struct {
	ID    int
	Name  string
	Email string
}

func queryUsers(db *sql.DB) {
	rows, err := db.Query("SELECT id, name, email FROM users")
	if err != nil {
		panic(err.Error())
	}
	defer rows.Close()

	var users []User
	for rows.Next() {
		var u User
		err := rows.Scan(&u.ID, &u.Name, &u.Email)
		if err != nil {
			panic(err.Error())
		}
		users = append(users, u)
	}

	fmt.Printf("查询到%d条用户记录\n", len(users))
}

插入数据

func insertUser(db *sql.DB, name, email string) {
	result, err := db.Exec("INSERT INTO users(name, email) VALUES(?, ?)", name, email)
	if err != nil {
		panic(err.Error())
	}

	id, _ := result.LastInsertId()
	fmt.Printf("插入成功,ID为%d\n", id)
}

更新数据

func updateUser(db *sql.DB, id int, name string) {
	result, err := db.Exec("UPDATE users SET name = ? WHERE id = ?", name, id)
	if err != nil {
		panic(err.Error())
	}

	rowsAffected, _ := result.RowsAffected()
	fmt.Printf("更新了%d条记录\n", rowsAffected)
}

删除数据

func deleteUser(db *sql.DB, id int) {
	result, err := db.Exec("DELETE FROM users WHERE id = ?", id)
	if err != nil {
		panic(err.Error())
	}

	rowsAffected, _ := result.RowsAffected()
	fmt.Printf("删除了%d条记录\n", rowsAffected)
}

事务处理

func transferMoney(db *sql.DB, from, to, amount int) {
	tx, err := db.Begin()
	if err != nil {
		panic(err.Error())
	}

	// 转账操作
	_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, from)
	if err != nil {
		tx.Rollback()
		panic(err.Error())
	}

	_, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, to)
	if err != nil {
		tx.Rollback()
		panic(err.Error())
	}

	err = tx.Commit()
	if err != nil {
		panic(err.Error())
	}
	fmt.Println("转账成功")
}

使用ORM (GORM)

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	Name  string
	Email string
}

func main() {
	dsn := "用户名:密码@tcp(127.0.0.1:3306)/数据库名?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接数据库失败")
	}

	// 自动迁移
	db.AutoMigrate(&User{})

	// 创建记录
	db.Create(&User{Name: "张三", Email: "zhangsan@example.com"})

	// 查询记录
	var user User
	db.First(&user, "name = ?", "张三")
	fmt.Printf("ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email)
}

以上代码涵盖了Golang中数据库操作的基本知识,包括原生SQL操作和ORM框架GORM的使用。

回到顶部