zoukankan      html  css  js  c++  java
  • 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的设计思想。

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

  • 相关阅读:
    JS 变量的作用域
    清理网站缓存的几种方法
    C# 将程序添加到启动项 (写入注册表),及从启动项中删除
    EasyUI iconCls
    JQuery Easy Ui dataGrid 数据表格
    datatable转换为json
    Web window.print() 打印
    用js使得输入框input只能输入数字
    隐藏或删除指定的html元素
    使用Asponse.Cell解决Excel科学计数法问题
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12191515.html
Copyright © 2011-2022 走看看