Golang 数据库 *** 作

Golang 数据库 *** 作,第1张

概述Golang 数据库 *** 作 Golang 数据库 MySQL Golang支持DB *** 作位于database包下,支持基本CRUD *** 作、事务和Prepared Statement,本文以MySQL为例。 MySQL驱动安装  使用数据库之前,必须安装相关MySQL数据驱动[1],如果未安装驱动或者没有引入驱动库会报以下错误:  failed to open database: sql: unknown Golang 数据库 *** 作 Golang 数据库 MysqL Golang支持DB *** 作位于database包下,支持基本CRUD *** 作、事务和Prepared Statement,本文以MysqL为例。 MysqL驱动安装 使用数据库之前,必须安装相关MysqL数据驱动[1],如果未安装驱动或者没有引入驱动库会报以下错误: Failed to open database: sql: unkNown driver "MysqL" (forgotten import?) 安装golang MysqL driver go get github.com/go-sql-driver/MysqL 代码中还需注册数据库驱动,通过引入空白倒入[2]MysqL包来完成 import( "database/sql" // 引入数据库驱动注册及初始化 _ "github.com/go-sql-driver/MysqL" ) 这段空白倒入代码实际执行MysqL包的初始化代码,位于%GOPATH%/github.com/go-sql-driver/MysqL/driver.go func init() { sql.Register("MysqL",&MysqLDriver{}) } 准备测试数据 连接MysqL MysqL -uroot -p 选择数据库test use test 创建测试用的users表和order表,并插入测试数据 #创建user表 DROP table IF EXISTS `order`; DROP table IF EXISTS `user`; CREATE table IF NOT EXISTS `user` (`uID` SERIAL PRIMARY KEY,`name` VARCHAR(20) NOT NulL,`password` VARCHAR(20) NOT NulL) ENGINE=`innodb`,CHaraCTER SET=utf8; #创建order表 CREATE table IF NOT EXISTS `order`(`oID` SERIAL PRIMARY KEY,`uID` BIGINT(20) UNSIGNED NOT NulL,`date` TIMESTAMP NOT NulL DEFAulT CURRENT_TIMESTAMP,FOREIGN KEY (`uID`) REFERENCES `user`(`uID`))ENGINE=innodb,CHaraCTER SET=utf8; #插入测试数据 INSERT INTO `user`(`name`,`password`) VALUES('nick','nick'),('jacky','jacky'); INSERT INTO `order`(`uID`) VALUES(1),(2); 连接数据库 连接数据的DSN格式为: username:password@protocol(address)/dbname?param=value 示例代码: db,err := sql.Open("MysqL","root:root@tcp(127.0.0.1:3306)/test?charset=utf8") if err != nil { fmt.Println("Failed to open database:",err.Error()) return } if err := db.Ping(); err != nil { fmt.Println("%s error Ping database: %s",err.Error()) return } defer db.Close() 返回的DB对象,实际封装了一个数据库连接池,对于goroutine是线程安全的,可以放心使用。这个数据库连接池由"database/sql"包负责自动创建和回收。连接池的大小可以由SetMaxIDleConns指定。 需要注意的是,创建DB对象成功,并不代表已经成功的连接了数据库,数据库连接只有在真正需要的时候才会被创建。因此如果,在创建DB对象后想验证数据库连接是否有效,可以调用Ping()或者通过 关闭数据库 defer db.Close() 关闭数据库并释放全部已打开的资源。实际上,很少需要进行关闭 *** 作,DB对象实际上长期存活并在所有的goroutine之间共享 CRUD DB中执行sql通过Exec和query方法,查询 *** 作是通过query完成,它会返回一个sql.Rows的结果集,包含一个游标用来遍历查询结果;Exec方法返回的是sql.Result对象,用于检测 *** 作结果,及被影响记录数 查询 // 获取USERS表中的前十行记录 rows,err := db.query("SELECT * FROM user") if err != nil { fmt.Println("fetech data Failed:",err.Error()) return } defer rows.Close() for rows.Next() { var uID int var name,password string rows.Scan(&uID,&name,&password) fmt.Println("uID:",uID,"name:",name,"password:",password) } 注意:rows必须进行关闭否则会导致数据库连接无法关闭,长时间运行会导致"too many connections" 插入 // 插入一条新数据 result,err := db.Exec("INSERT INTO `user`(`name`,`password`) VALUES('tom','tom')") if err != nil { fmt.Println("insert data Failed:",err.Error()) return } ID,err := result.LastInsertID() if err != nil { fmt.Println("fetch last insert ID Failed:",err.Error()) return } fmt.Println("insert new record",ID) 更新 // 更新一条数据 result,err = db.Exec("UPDATE `user` SET `password`=? WHERE `name`=?","tom_new_password","tom") if err != nil { fmt.Println("update data Failed:",err.Error()) return } num,err := result.RowsAffected() if err != nil { fmt.Println("fetch row affected Failed:",err.Error()) return } fmt.Println("update recors number",num) 删除 // 删除数据 result,err = db.Exec("DELETE FROM `user` WHERE `name`=?","tom") if err != nil { fmt.Println("delete data Failed:",err = result.RowsAffected() if err != nil { fmt.Println("fetch row affected Failed:",err.Error()) return } fmt.Println("delete record number",num) 事务支持 sql.Tx用来支持事务处理 // 事务处理 // 完全删除用户编号为2的用户数据 tx,err := db.Begin() result,err = tx.Exec("DELETE FROM `order` WHERE uID=? ",2) if err != nil { fmt.Println("delete data Failed:",num) result,err = tx.Exec("DELETE FROM `user` WHERE uID=? ",num) // 根据条件回滚或者提交 // tx.Rollback() tx.Commit() Prepared Statement sql.Stmt支持预备表达式,可以用来优化SQL查询提高性能,减少sql注入的风险,DB.Prepare()和Tx.Prepare()都提供了对于预备表达式的支持。 // 预备表达式 stmt,err := db.Prepare("DELETE FROM `order` WHERE `oID`=?") if err != nil { fmt.Println("fetch row affected Failed:",err.Error()) return } result,err = stmt.Exec(1) if err != nil { fmt.Println("delete data Failed:",num) 总结

以上是内存溢出为你收集整理的Golang 数据库 *** 作全部内容,希望文章能够帮你解决Golang 数据库 *** 作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1287432.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存