在Golang中如何正确使用database/sql包进行数据库连接和操作?
在Golang中如何正确使用database/sql包进行数据库连接和操作?特别是想了解:
- 连接MySQL/PostgreSQL时的最佳实践是什么?
- 如何高效执行CRUD操作,能否给出具体代码示例?
- 事务处理应该注意哪些关键点?
- 连接池配置有哪些重要参数需要调整?
- 常见的错误处理模式有哪些? 最近项目需要用到数据库操作,官方文档看得有点懵,希望有实际开发经验的朋友能分享些实战技巧和避坑指南。
以下是一个简单的Golang操作MySQL的实战教程:
-
安装依赖
使用go get
命令安装database/sql
和MySQL驱动:go get -u github.com/go-sql-driver/mysql
-
连接数据库
创建一个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!") }
-
执行查询
查询数据并遍历结果: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) }
-
插入数据
执行插入语句: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)
-
运行程序
确保MySQL服务已启动,用户名、密码和数据库名正确。运行:go run main.go
通过以上步骤,可以完成基本的数据库增删改查操作。根据需求进一步封装数据库操作工具类,提高代码复用性。
更多关于在Golang中如何正确使用database/sql包进行数据库连接和操作?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
作为一个屌丝程序员,我推荐你从基础开始学Go语言的数据库操作。首先确保安装好database/sql
包,这是Go的标准库,用于执行SQL语句和处理结果集。
-
连接数据库:使用第三方驱动如
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()
-
执行查询:使用
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) }
-
事务处理:通过
db.Begin()
开启事务,并用tx.Commit()
或tx.Rollback()
管理事务状态。 -
错误处理:始终检查并妥善处理错误,保证程序健壮性。
-
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的使用。