当前位置: 首页 > news >正文

Go语言中的MySQL操作:database/sql实战

Go语言中的MySQL操作:database/sql实战

1. database/sql包简介

Go语言的database/sql包提供了通用的SQL数据库接口,配合MySQL驱动可以实现对MySQL数据库的操作。本文将详细介绍如何使用database/sql包进行MySQL数据库操作。

2. 连接数据库

2.1 安装驱动

go get -u github.com/go-sql-driver/mysql

2.2 建立连接

package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { // 连接字符串 dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" // 打开数据库连接 db, err := sql.Open("mysql", dsn) if err != nil { log.Fatal(err) } defer db.Close() // 测试连接 err = db.Ping() if err != nil { log.Fatal(err) } fmt.Println("Successfully connected to database") }

3. 基本CRUD操作

3.1 创建表

func createTable(db *sql.DB) error { query := `CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )` _, err := db.Exec(query) return err }

3.2 插入数据

func insertUser(db *sql.DB, name, email string, age int) (int64, error) { result, err := db.Exec( "INSERT INTO users (name, email, age) VALUES (?, ?, ?)", name, email, age, ) if err != nil { return 0, err } return result.LastInsertId() }

3.3 查询数据

func getUser(db *sql.DB, id int) (*User, error) { var user User err := db.QueryRow( "SELECT id, name, email, age, created_at FROM users WHERE id = ?", id, ).Scan(&user.ID, &user.Name, &user.Email, &user.Age, &user.CreatedAt) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } return &user, nil }

3.4 更新数据

func updateUser(db *sql.DB, id int, name string) error { _, err := db.Exec( "UPDATE users SET name = ? WHERE id = ?", name, id, ) return err }

3.5 删除数据

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

4. 事务处理

func transferMoney(db *sql.DB, fromID, toID int, amount float64) error { tx, err := db.Begin() if err != nil { return err } defer tx.Rollback() // 扣款 _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, fromID) if err != nil { return err } // 收款 _, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, toID) if err != nil { return err } return tx.Commit() }

5. 连接池配置

func setupDB(dsn string) (*sql.DB, error) { db, err := sql.Open("mysql", dsn) if err != nil { return nil, err } // 设置连接池参数 db.SetMaxOpenConns(25) // 最大打开连接数 db.SetMaxIdleConns(10) // 最大空闲连接数 db.SetConnMaxLifetime(5 * time.Minute) // 连接最大生命周期 return db, nil }

6. 总结

使用database/sql包进行MySQL操作时,应该注意:

  1. 使用参数化查询防止SQL注入
  2. 正确处理事务,确保数据一致性
  3. 合理配置连接池参数
  4. 及时关闭数据库连接
  5. 处理所有可能的错误情况
http://www.jsqmd.com/news/564716/

相关文章:

  • 2026年广州别墅整木定制品牌排名,珑宅全屋定制口碑出众值得推荐 - 工业品网
  • GTR与IGBT的世纪对决:老牌电力晶体管的生存之道与现代替代方案对比
  • Laravel Pint版本演进:从v0.1.0到v1.26.0的完整发展历程
  • 引言:办公家具回收的核心需求 - 资讯焦点
  • s2-proGPU部署方案:多模型共存时s2-pro显存隔离与QoS保障策略
  • 如何用10MB工具解决Steam创意工坊三大痛点:WorkshopDL全解析
  • 掌握AI专著生成技巧,借助优质工具,轻松完成学术巨作
  • 分析气流混合机噪音小的品牌,2026年度性价比品牌推荐 - 工业设备
  • Vue3 + Three.js 实战:用GSAP和射线拾取,打造一个可点击移动的3D角色(保姆级避坑指南)
  • Super IO Blender插件:基于剪贴板机制的跨平台资产工作流优化方案
  • intv_ai_mk11从零开始教程:不写代码,纯浏览器操作完成全部AI交互
  • AI论文生成工具有哪些?8款写论文的AI亲测,AI论文AIGC与低查重兼得! - 掌桥科研-AI论文写作
  • 计算机领域·未来十年黄金赛道:2026年薪资将超传统行业 3 倍,人才缺口达 327 万!
  • Python入门项目:用10行代码调用MogFace-large实现人脸检测
  • Win11Debloat:Windows系统轻量化优化工具全解析
  • 2026年4月 山东彩钢瓦翻新防水卷材厂家实力推荐 最新排名 - 资讯焦点
  • 半导体制造中的ProcessJob与Control Job:从定义到实战避坑指南
  • 2026上海货架回收权威选型榜单:全程自营不转包服务商实力排名 - 资讯焦点
  • 数字身份管理工具:手机号与QQ号智能关联的技术实现与安全实践
  • VSCode + WSL-Ubuntu 20.04 开发环境配置:从零搭建C++开发环境(含Clangd智能补全)
  • Poppins字体完全指南:如何在项目中免费使用这款国际化的几何无衬线字体
  • ET-Net进阶:边缘注意力引导在医学图像分割中的多任务应用实践
  • 从零开始:武商一卡通回收的入门指南与实操技巧 - 团团收购物卡回收
  • Kandinsky-5.0-I2V-Lite-5s性能解析:24GB显存下稳定跑通的图生视频方案
  • 【ArkTS】基础语法
  • Keil中“function definition is not allowed here”错误的5种常见场景及解决方案
  • 大气层开源固件完全指南:从概念到实践的系统定制之旅
  • 手把手教你为OpenBMC (AST2600平台) 正确配置PCA9545 I2C Switch的DTS节点
  • 拒绝在AI时代被遗忘:深度解析XOOER品牌能见度评分与Schema优化 - 资讯焦点
  • 2026年天津太阳能光伏车棚品牌制造商排名,看看哪家好用 - 工业品牌热点