golang连接操作mysql
golang操作mysql
package main import ( "database/sql" "fmt" "time" _ "github.com/go-sql-driver/mysql" ) //定义一个全局db对象 var db *sql.DB func initDB() (err error) { dsn := "user:password@tcp(172.xxx.102.xxx:3306)/go_db?charset=utf8mb4&parseTime=True" db, err = sql.Open("mysql", dsn) if err != nil { panic(err) } // fmt.Printf("db=%v", db) // defer db.Close() err = db.Ping() if err != nil { fmt.Printf("connect db failed:%v", err) return } db.SetMaxIdleConns(10) db.SetMaxOpenConns(200) db.SetConnMaxLifetime(time.Second * 10) return } // func insert() { // s := "insert into info(name,age) values(?,?)" // r, err := db.Exec(s, "zhangsan", 22) // if err != nil { // fmt.Printf("err:%v\n", err) // } else { // i, _ := r.LastInsertId() // fmt.Printf("i:%v\n", i) // } // } // 插入数据 func insertRowDemo() { sqlStr := "insert into info(id,name, age) values (?,?,?)" ret, err := db.Exec(sqlStr, 3, "王五", 38) if err != nil { fmt.Printf("insert failed, err:%v\n", err) return } theID, err := ret.LastInsertId() // 新插入数据的id if err != nil { fmt.Printf("get lastinsert ID failed, err:%v\n", err) return } fmt.Printf("insert success, the id is %d.\n", theID) } type User struct { id int name string age int } func queryOneRow() { s := "select * from info where id = ?" var u User err := db.QueryRow(s, 1).Scan(&u.id, &u.name, &u.age) if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Printf("u: %v\n", u) } } // 查询多条数据示例 func queryMultiRowDemo() { sqlStr := "select id, name, age from info where id > ?" rows, err := db.Query(sqlStr, 0) if err != nil { fmt.Printf("query failed, err:%v\n", err) return } // fmt.Printf("rows=%v", rows) // 非常重要:关闭rows释放持有的数据库链接 defer rows.Close() // 循环读取结果集中的数据 for rows.Next() { var u User err := rows.Scan(&u.id, &u.name, &u.age) if err != nil { fmt.Printf("scan failed, err:%v\n", err) return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age) } } func update() { s := "update info set name=? where id=?" r, err := db.Exec(s, "王二麻子", 3) if err != nil { fmt.Printf("err: %v\n", err) return } i, err2 := r.RowsAffected() if err2 != nil { fmt.Println("get afectd rows failed") return } fmt.Println("update success,afected rows:%d\n", i) } // 删除数据 func deleteRowDemo() { sqlStr := "delete from info where id = ?" ret, err := db.Exec(sqlStr, 3) if err != nil { fmt.Printf("delete failed, err:%v\n", err) return } n, err := ret.RowsAffected() // 操作影响的行数 if err != nil { fmt.Printf("get RowsAffected failed, err:%v\n", err) return } fmt.Printf("delete success, affected rows:%d\n", n) } // ### sql预处理 //预处理插入 func prepareInsertDemo() { sqlStr := "insert into info(id,name,age) values(?,?,?)" s, err := db.Prepare(sqlStr) if err != nil { fmt.Printf("prepare failed,err:%v\n", err) return } defer s.Close() _, err2 := s.Exec(10, "小王子", 20) if err2 != nil { fmt.Printf("insert failed,err2:%v\n", err2) return } fmt.Println("insert success...") } //预处理查询 func prepareQueryDemo() { sqlStr := "select id,name,age from info where id > ?" s, err := db.Prepare(sqlStr) if err != nil { fmt.Println("prepare failed,err:%v\n", err) return } defer s.Close() r, err2 := s.Query(0) if err2 != nil { fmt.Printf("query failed,err:$%v\n", err2) return } defer r.Close() //循环读取结果 for r.Next() { var u User err := r.Scan(&u.id, &u.name, &u.age) if err != nil { fmt.Printf("scan failed,err:%v\n", err) return } fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age) } } func main() { err := initDB() //调用初始化数据的函数 if err != nil { fmt.Printf("init db failed,err:%v\n", err) return } else { fmt.Println("连接成功") } // insert() // insertRowDemo() // defer db.Close() // fmt.Println("===========") // queryOneRow() // queryMultiRowDemo() // update() // deleteRowDemo() // prepareInsertDemo() prepareQueryDemo() }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?