news 2026/4/19 0:23:28

Go语言的数据库操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go语言的数据库操作

Go语言的数据库操作

数据库操作基础

Go语言提供了标准的数据库接口database/sql包,用于与各种数据库进行交互。同时,需要为特定数据库安装相应的驱动。

基本使用

安装驱动

以MySQL为例,安装驱动:

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

连接数据库

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") if err != nil { fmt.Println("Error connecting to database:", err) return } defer db.Close() // 测试连接 err = db.Ping() if err != nil { fmt.Println("Error pinging database:", err) return } fmt.Println("Connected to database successfully") }

执行SQL语句

查询数据

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) type User struct { ID int Name string Age int } func main() { db, _ := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") defer db.Close() rows, err := db.Query("SELECT id, name, age FROM users") if err != nil { fmt.Println("Error querying database:", err) return } defer rows.Close() var users []User for rows.Next() { var user User err := rows.Scan(&user.ID, &user.Name, &user.Age) if err != nil { fmt.Println("Error scanning row:", err) return } users = append(users, user) } for _, user := range users { fmt.Printf("ID: %d, Name: %s, Age: %d\n", user.ID, user.Name, user.Age) } }

插入数据

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { db, _ := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") defer db.Close() result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "John", 30) if err != nil { fmt.Println("Error inserting data:", err) return } id, err := result.LastInsertId() if err != nil { fmt.Println("Error getting last insert ID:", err) return } fmt.Printf("Inserted user with ID: %d\n", id) }

更新数据

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { db, _ := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") defer db.Close() result, err := db.Exec("UPDATE users SET age = ? WHERE id = ?", 31, 1) if err != nil { fmt.Println("Error updating data:", err) return } rowsAffected, err := result.RowsAffected() if err != nil { fmt.Println("Error getting rows affected:", err) return } fmt.Printf("Updated %d rows\n", rowsAffected) }

删除数据

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { db, _ := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") defer db.Close() result, err := db.Exec("DELETE FROM users WHERE id = ?", 1) if err != nil { fmt.Println("Error deleting data:", err) return } rowsAffected, err := result.RowsAffected() if err != nil { fmt.Println("Error getting rows affected:", err) return } fmt.Printf("Deleted %d rows\n", rowsAffected) }

使用事务

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { db, _ := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") defer db.Close() tx, err := db.Begin() if err != nil { fmt.Println("Error starting transaction:", err) return } // 执行多个SQL语句 _, err = tx.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "John", 30) if err != nil { tx.Rollback() fmt.Println("Error inserting user:", err) return } _, err = tx.Exec("INSERT INTO orders (user_id, product) VALUES (?, ?)", 1, "Product 1") if err != nil { tx.Rollback() fmt.Println("Error inserting order:", err) return } // 提交事务 err = tx.Commit() if err != nil { fmt.Println("Error committing transaction:", err) return } fmt.Println("Transaction completed successfully") }

使用预处理语句

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { db, _ := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") defer db.Close() // 准备预处理语句 stmt, err := db.Prepare("SELECT id, name, age FROM users WHERE age > ?") if err != nil { fmt.Println("Error preparing statement:", err) return } defer stmt.Close() // 执行预处理语句 rows, err := stmt.Query(25) if err != nil { fmt.Println("Error executing statement:", err) return } defer rows.Close() for rows.Next() { var id int var name string var age int err := rows.Scan(&id, &name, &age) if err != nil { fmt.Println("Error scanning row:", err) return } fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age) } }

数据库连接池

package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { db, _ := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") defer db.Close() // 配置连接池 db.SetMaxOpenConns(25) // 最大打开连接数 db.SetMaxIdleConns(5) // 最大空闲连接数 fmt.Println("Connection pool configured successfully") }

示例:完整的数据库操作

package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) type User struct { ID int Name string Age int } func main() { // 连接数据库 db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/database") if err != nil { log.Fatal("Error connecting to database:", err) } defer db.Close() // 测试连接 err = db.Ping() if err != nil { log.Fatal("Error pinging database:", err) } // 创建表 _, err = db.Exec(`CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, age INT NOT NULL )`) if err != nil { log.Fatal("Error creating table:", err) } // 插入数据 result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "John", 30) if err != nil { log.Fatal("Error inserting data:", err) } id, _ := result.LastInsertId() fmt.Printf("Inserted user with ID: %d\n", id) // 查询数据 rows, err := db.Query("SELECT id, name, age FROM users") if err != nil { log.Fatal("Error querying data:", err) } defer rows.Close() var users []User for rows.Next() { var user User err := rows.Scan(&user.ID, &user.Name, &user.Age) if err != nil { log.Fatal("Error scanning row:", err) } users = append(users, user) } fmt.Println("Users:") for _, user := range users { fmt.Printf("ID: %d, Name: %s, Age: %d\n", user.ID, user.Name, user.Age) } // 更新数据 _, err = db.Exec("UPDATE users SET age = ? WHERE id = ?", 31, id) if err != nil { log.Fatal("Error updating data:", err) } // 删除数据 _, err = db.Exec("DELETE FROM users WHERE id = ?", id) if err != nil { log.Fatal("Error deleting data:", err) } fmt.Println("Database operations completed successfully") }

总结

Go语言的database/sql包提供了统一的数据库操作接口,支持多种数据库。通过合理使用连接池、预处理语句和事务,可以编写高效、安全的数据库操作代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 18:12:11

从MathType 6.9升级到7.0中文版:Word公式编辑效率提升全攻略

MathType 7.0中文版深度评测:公式编辑效率革命 记得第一次接触MathType还是在研究生阶段,那时为了赶制毕业论文,不得不与Word自带的公式编辑器展开长达数周的"拉锯战"。直到实验室师兄推荐了MathType 6.9,才真正体会到什…

作者头像 李华
网站建设 2026/4/16 18:08:25

rEFInd多系统引导优化:Win10+Ubuntu+Deepin+macOS等menuentry精简配置实战

1. 为什么需要优化rEFInd引导菜单 第一次安装rEFInd引导管理器时,很多人都会被它自动生成的杂乱菜单震惊到。我自己的电脑装了Win10、Ubuntu和Deepin三系统,结果rEFInd给我列出了十几个启动项,其中还包括一堆重复的内核版本和根本不认识的图标…

作者头像 李华
网站建设 2026/4/16 18:05:57

LaTeX 作者简介页:从基础排版到自定义照片布局

1. 理解期刊格式要求 在准备学术论文投稿时,期刊对作者简介页的格式要求往往各不相同。有些期刊会提供明确的模板,而有些则只给出基本规范。我遇到过最严格的情况是某期刊要求作者照片必须为1.5英寸2英寸,且简介字数不得超过150字。建议在开始…

作者头像 李华
网站建设 2026/4/16 18:05:15

RFdiffusion酶设计实战:从5an7.pdb到活性口袋生成的保姆级参数解析

RFdiffusion酶设计实战:从5an7.pdb到活性口袋生成的保姆级参数解析 当你第一次打开RFdiffusion的base.yaml配置文件时,面对密密麻麻的参数列表,是否感到无从下手?作为一款革命性的蛋白质设计工具,RFdiffusion的强大功能…

作者头像 李华
网站建设 2026/4/16 18:03:36

DSN(Data Source Name,数据源名称、数据源描述)介绍(用于标识数据库连接信息的配置集合)(命名DSN、/etc/odbc.ini、 DSN连接字符串)

示例格式: protocol://username:passwordhost:port/database?params文章目录数据库 DSN(Data Source Name)详解一、什么是 DSN?二、DSN 的核心作用1. 简化连接配置2. 解耦代码与环境三、DSN 的两种常见形式1. 命名 DSN&#xff…

作者头像 李华
网站建设 2026/4/16 18:02:29

Node.js实战:手把手教你调用EduCoder实训平台API(附完整封装代码)

Node.js实战:从零封装EduCoder平台API的完整指南 在编程学习过程中,实训平台扮演着至关重要的角色。EduCoder作为国内知名的在线编程实训平台,提供了丰富的编程练习和项目实战机会。但对于开发者而言,如何通过程序化方式与平台交互…

作者头像 李华