欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

goweb-访问数据库

程序员文章站 2022-05-29 08:14:34
访问数据库 对许多Web应用程序而言,数据库都是其核心所在。数据库几乎可以用来存储你想查询和修改的任何信息,比如用户信息、产品目录或者新闻列表等。 Go没有内置的驱动支持任何的数据库,但是Go定义了database/sql接口,用户可以基于驱动接口开发相应数据库的驱动, 目前NOSQL已经成为Web ......

访问数据库

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

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