当前位置: 移动技术网 > IT编程>脚本编程>Go语言 > goweb-访问数据库

goweb-访问数据库

2020年01月14日  | 移动技术网IT编程  | 我要评论

访问数据库

对许多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的设计思想。

所以我要深入了解~~~~~~······

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网