大佬教程收集整理的这篇文章主要介绍了golang-数据库详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
注意:DB并不是指的一个connection
我们以mysql为例,使用github.com/go-sql-driver/mysql,首先我们需要导入我们需要的包
import ( "database/sql" _ "github.com/go-sql-driver/mysql" )
注意我们导入github.com/go-sql-driver/mysql 前面用了一个"",操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数,import的时候其实是执行了该包里面的init函数,初始化了里面的变量,_操作只是说该包引入了,我只初始化里面的 init函数和一些变量,但是往往这些init函数里面是注册自己包里面的引擎,让外部可以方便的使用,就很多实现database/sql的包,在 init函数里面都是调用了sql.Register(name String,driver driver.Driver)注册自己,然后外部就可以使用了。
我们用Open()函数来打开一个database handle
db, err := sql.Open("mysql" "user:@R_674_5747@d@tcp(ip:port)/database" 写一个完整的:"log") func main(){ db if!= nil logPrintlnerr } //在这里进行一些数据库操作 defer dbClose}
我们在执行Open函数的时候,并不会去获得数据库连接有效性,当执行数据库操作的时候才会去连接,当我们需要在Open之后就知道连接的有效性的时候,可以通过Ping()来进行
err = dbPing log 我们通常习惯使用Close来关闭数据库连接,但是sql.DB是被设计成长期有效的类型,我们不应该频繁的Open和Close,相反,我们应该建立一个sql.DB,在程序需要进行数据库操作的时候一直使用它,不要在一个方法里面进行Open和Close,应该把sql.DB作为参数传递给方法进行数据库操作
增删改操作@H_696_147@
Exec()方法一般用于增删改操作,这里以增加为例:
stmtPrepare"insert into user(name,agE)values(?,?)" rs stmtExec"go-test" 12 //我们可以获得插入的id id rsLasTinsertId//可以获得影响行数 affectRowsAffected()
var name String age int rowsQuery"SELEct name,age from user where id = ? "1 fmt defer rowsfor rowsNext err Scan(&name&age fmt err Err fmt"name:" url"age:" description 我们应该养成关闭rows的习惯,在任何时候,都不要忘记rows.Close().哪怕这个rows在确实循环完之后,已经自动关闭掉了,我们定义rows.Close()也是对我们没有坏处的,因为我们无法保证,rows是否会正常的循环完。查询单条记录,
我们使用db.QueryRow()
errQueryRow"SELEct name from user where id = ?"222). 没有结果的时候会返回err处理空值
我们用一个name字段为空的记录来举例
nameNullString err "SELECT name FROM names WHERE id = ?" id... nameValid // use name.Stringelse// value is NULL 在这种情况下我们通常使用NullString,但是有时候我们并不关心值是不是Null,我们只需要吧他当一个空字符串来对待就行。这时候我们可以使用[]byte(null byte[]可以转化为空String) 或者sql.RawBytes,col1col2 []byte// Scan the value to []bytecol1col2 panicError()) // Just for example purpose. You should use proper error handling instead of panic// Use the String value fmt(String),0)">)) 使用*sql.RawBytespackagemain "fmt" _ // Open database connection"user:@R_674_5747@d@/dbname" // Execute the query rows"SELECT * FROM table"// proper error handling instead of panic in your app// Get column names columnscolumns// Make a slice for the values values make([]sqlRawBytes lencolumns// rows.Scan wants '[]interface{}' as an argument,so we must copy the// references into such a slice// See http://code.google.com/p/go-wiki/wiki/InterfaceSlice for details scanArgs ([]interface{},0)">values i range values scanArgs[i]// Fetch rows// get RawBytes from data err scanArgs...) panic // Now do something with the data.// Here we just print each column as a String. value i col // Here we can check if the value is nil (NULL value) == value "NULL" col fmt],255)">": " value fmt"-----------------------------------"();}
使用db.begin()来开启一个事务,通过Commit()和RollBACk()方法来关闭。
tx Begin txRollBACkCommit()
Exec,Query,QueryRow and Prepare 方法已经全部可以在tx上面使用。使用方法和在*sql.DB是一样的,事务必须以Commit()或者RollBACk()结束
在database/sql中有一个很基本的连接池,你并没有多大的控制权,仅仅可以设置SetMaxIdleConns和SetMaxOpenConns,也就是最大空闲连接和最大连接数。
dbSetMaxIdleConnsn dbSetMaxOpenConns)
以上是大佬教程为你收集整理的golang-数据库详解全部内容,希望文章能够帮你解决golang-数据库详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。