goweb-访问数据库
访问数据库
对许多web应用程序而言,数据库都是其核心所在。数据库几乎可以用来存储你想查询和修改的任何信息,比如用户信息、产品目录或者新闻列表等。
go没有内置的驱动支持任何的数据库,但是go定义了database/sql接口,用户可以基于驱动接口开发相应数据库的驱动,
目前nosql已经成为web开发的一个潮流,很多应用采用了nosql作为数据库,而不是以前的缓存
go database/sql tutorial 里提供了惯用的范例及详细的说明。
database/sql接口
go与php不同的地方是go官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口,开发者可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处,只要是按照标准接口开发的代码, 以后需要迁移数据库时,不需要任何修改。
在我们使用database/sql接口和第三方库的时候经常看到如下:
import ( "database/sql" _ "github.com/mattn/go-sqlite3" )
新手都会被这个_所迷惑,其实这个就是go设计的巧妙之处,我们在变量赋值的时候经常看到这个符号,它是用来忽略变量赋值的占位符,那么包引入用到这个符号也是相似的作用,这儿使用_的意思是引入后面的包名而不直接使用这个包中定义的函数,变量等资源。
包在引入的时候会自动调用包的init函数以完成对包的初始化。因此,我们引入上面的数据库驱动包之后会自动去调用init函数,然后在init函数里面注册这个数据库驱动,这样我们就可以在接下来的代码中直接使用这个数据库驱动了。
这竟然在讲如何开发一个驱动,我的天,原谅我尚才疏学浅,这里还讲了高级用法,可惜我看不懂o(╥﹏╥)o
使用mysql数据库
目前internet上流行的网站构架方式是lamp,其中的m即mysql, 作为数据库,mysql以免费、开源、使用方便为优势成为了很多web开发的后端数据库存储引擎
sql.open()函数用来打开一个注册过的数据库驱动,go-sql-driver中注册了mysql这个数据库驱动,第二个参数是dsn(data source name),它是go-sql-driver定义的一些数据库链接和配置信息。它支持如下格式:
user@unix(/path/to/socket)/dbname?charset=utf8 user:password@tcp(localhost:5555)/dbname?charset=utf8 user:password@/dbname user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname
db.prepare()函数用来返回准备要执行的sql操作,然后返回准备完毕的执行状态。
db.query()函数用来直接执行sql返回rows结果。
stmt.exec()函数用来执行stmt准备好的sql语句
传入的参数都是=?对应的数据,这样做的方式可以一定程度上防止sql注入。
create table `userinfo` ( `uid` int(10) not null auto_increment, `username` varchar(64) null default null, `department` varchar(64) null default null, `created` date null default null, primary key (`uid`) ); create table `userdetail` ( `uid` int(10) not null default '0', `intro` text null, `profile` text null, primary key (`uid`) )
如下示例将示范如何使用database/sql接口对数据库表进行增删改查操作
package main import ( "database/sql" "fmt" //"time" _ "github.com/go-sql-driver/mysql" ) func main() { db, err := sql.open("mysql", "astaxie:astaxie@/test?charset=utf8") checkerr(err) //插入数据 stmt, err := db.prepare("insert into userinfo set username=?,department=?,created=?") checkerr(err) res, err := stmt.exec("astaxie", "研发部门", "2012-12-09") checkerr(err) id, err := res.lastinsertid() checkerr(err) fmt.println(id) //更新数据 stmt, err = db.prepare("update userinfo set username=? where uid=?") checkerr(err) res, err = stmt.exec("astaxieupdate", id) checkerr(err) affect, err := res.rowsaffected() checkerr(err) fmt.println(affect) //查询数据 rows, err := db.query("select * from userinfo") checkerr(err) for rows.next() { var uid int var username string var department string var created string err = rows.scan(&uid, &username, &department, &created) checkerr(err) fmt.println(uid) fmt.println(username) fmt.println(department) fmt.println(created) } //删除数据 stmt, err = db.prepare("delete from userinfo where uid=?") checkerr(err) res, err = stmt.exec(id) checkerr(err) affect, err = res.rowsaffected() checkerr(err) fmt.println(affect) db.close() } func checkerr(err error) { if err != nil { panic(err) } }
使用sqlite数据库
sqlite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的sql数据库引擎。其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,sqlite 的安装和运行非常简单,在大多数情况下,只要确保sqlite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,sqlite是绝对值得考虑。sqlite可以说是开源的access。
使用postgresql数据库
postgresql 是一个*的对象-关系数据库服务器(数据库管理系统),它在灵活的 bsd-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 mysql 和 firebird),和对专有系统比如 oracle、sybase、ibm 的 db2 和 microsoft sql server的一种选择。
postgresql和mysql比较,它更加庞大一点,因为它是用来替代oracle而设计的。所以在企业应用中采用postgresql是一个明智的选择。
mysql被oracle收购之后正在逐步的封闭(自mysql 5.5.31以后的所有版本将不再遵循gpl协议),鉴于此,将来我们也许会选择postgresql而不是mysql作为项目的后端数据库。
使用beego orm库进行orm开发
beego orm是这本书的作者开发的一个go进行orm操作的库,它采用了go style方式对数据库进行操作,实现了struct到数据表记录的映射。beego orm是一个十分轻量级的go orm框架,开发这个库的本意降低复杂的orm学习曲线,尽可能在orm的运行效率和功能之间寻求一个平衡,beego orm是目前开源的go orm框架中实现比较完整的一个库,而且运行效率相当不错,功能也基本能满足需求。
beego orm是支持database/sql标准接口的orm库,所以理论上来说,只要数据库驱动支持database/sql接口就可以无缝的接入beego orm。
nosql数据库操作
nosql(not only sql),指的是非关系型的数据库。随着web2.0的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的sns类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
而go语言作为21世纪的c语言,对nosql的支持也是很好,目前流行的nosql主要有redis、mongodb、cassandra和membase等。这些数据库都有高性能、高并发读写等特点,目前已经广泛应用于各种应用中。这本书这一块接下来主要讲了一下redis和mongodb的操作。
redis
redis是一个key-value存储系统。和memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。
目前应用redis最广泛的应该是新浪微博平台,其次还有facebook收购的图片社交网站instagram。以及其他一些有名的互联网企业
mongodb
mongodb是一个高性能,开源,无模式的文档型数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,采用的是类似json的bjson格式来存储数据,因此可以存储比较复杂的数据类型。mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
目前go支持mongodb最好的驱动就是mgo,这个驱动目前最有可能成为官方的pkg。
我们可以看出来mgo的操作方式和beedb的操作方式几乎类似,都是基于struct的操作方式,这个就是go style。
这一章主要讲解了go如何设计database/sql接口,然后介绍了各种第三方关系型数据库驱动的使用。接着介绍了beedb,一种基于关系型数据库的orm库,如何对数据库进行简单的操作。最后介绍了nosql的一些知识,目前go对于nosql支持还是不错,因为go作为21世纪的c语言,那么对于21世纪的数据库也是支持的相当好。
通过这一章的学习,我们学会了如何操作各种数据库,那么就解决了我们数据存储的问题,这是web里面最重要的一部分,所以希望大家能够深入的去了解database/sql的设计思想。
所以我要深入了解~~~~~~······
上一篇: 《王者荣耀》官宣新皮肤 貂蝉绝美猫影幻舞皮肤惊艳亮相
下一篇: python获取当前文件的上一级目录