Go语言(十五)Database/Sql操作

こ雲淡風輕ζ 提交于 2020-01-14 08:58:59

Go语言Database/Sql操作

Go语言标准库中有两个包和DB操作相关,database/sql和database/sql/driver。

sql包提供了保证SQL或类SQL数据库的泛用接口。

driver包定义了应被数据库驱动实现的接口,这些接口会被sql包使用。

一、SQL操作

1、下载驱动

Go语言标准库提供的两个包都是相关接口,要连接数据库还需要相关驱动程序。

以操作MYSQL为例,需要的驱动可以通过go get命令在github上下载。

go get github.com/go-sql-driver/mysql 

下载下来的驱动包会存放在Gopath下。

2、sql操作

程序中需要导入两个包。

mysql驱动包只需要引入init()函数就行。

import (
	"database/sql"

    //通过_引入init()函数
	_"github.com/go-sql-driver/mysql"//驱动初始化
)

//初始函数给mysql注册了驱动
func init() {
    sql.Register("mysql", &MySQLDriver{})
}
1、连接驱动格式

在sql包下的Open函数中,需要连接数据库的驱动。格式如下

"mysql", "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8"
2、准备数据库

准备好数据库。

3、查询
package main


import (
	"database/sql"

	"fmt"
	_"github.com/go-sql-driver/mysql"
)
func main() {

	
	db, _ := sql.Open("mysql", "root:xxxxxx@tcp(127.0.0.1:3306)/study?charset=utf8")

	defer  db.Close()//defer关闭数据库连接

    //查询表、返回*Rows,其中存放着数据信息
	rows, _ := db.Query("select * from xxx")

	defer rows.Close()//defer关闭查询连接

    //获取列相关信息
	strings, _ := rows.Columns()
    
	for i:=0;i< len(strings);i++{
		fmt.Print(" ",strings[i])
	}

	fmt.Println()
    
		var id int
		var name string
		var sex string
		var about string
    
		for rows.Next(){
			rows.Scan(&id,&name,&sex,&about)//将一行数据放入参数中
			fmt.Println(id,name,sex,about)
		}
}


4、插入、删除、更新

func (*DB) [Exec]

func (db *DB) Exec(query string, args ...interface{}) (Result, error)

Exec执行一次命令(包括查询、删除、更新、插入等),不返回任何执行结果。参数args表示query中的占位参数。

    db, _ := sql.Open("mysql", "root:xxxxxx@tcp(127.0.0.1:3306)/study?charset=utf8")

	defer  db.Close()//defer关闭数据库连接	

	query:="insert into stu(id, name, sex, about) values(10,'陈浩南','男','物理')"

	db.Exec(query)//执行语句
5、事务

sql也支持事务,包括提交、回滚等。

	tx, _ := db.Begin()//事务

	tx.Exec("delete  from stu where id=19")

	tx.Commit()//提交

二、sql和driver

go语言标准库中提供的两个包。

1、sql/driver包

driver包定义了应被数据库驱动实现的接口,这些接口会被sql包使用。

type [Driver]

驱动接口

type Driver interface {
    // Open返回一个新的与数据库的连接,参数name的格式是驱动特定的。
    //
    // Open可能返回一个缓存的连接(之前关闭的连接),但这么做是不必要的;
    // sql包会维护闲置连接池以便有效的重用连接。
    //
    // 返回的连接同一时间只会被一个go程使用。
    Open(name string) (Conn, error)
}

type [Conn]

连接接口

type Conn interface {
    // Prepare返回一个准备好的、绑定到该连接的状态。
    Prepare(query string) (Stmt, error)

    // Close作废并停止任何现在准备好的状态和事务,将该连接标注为不再使用。
    //
    // 因为sql包维护着一个连接池,只有当闲置连接过剩时才会调用Close方法,
    // 驱动的实现中不需要添加自己的连接缓存池。
    Close() error

    // Begin开始并返回一个新的事务。
    Begin() (Tx, error)
}

type [Execer]

执行接口

type Execer interface {
    Exec(query string, args []Value) (Result, error)
}

type [Queryer]

查询接口

type Queryer interface {
    Query(query string, args []Value) (Rows, error)
}

type [Tx]

事务接口

type Tx interface {
    Commit() error
    Rollback() error
}
2、sql包

sql包提供了保证SQL或类SQL数据库的泛用接口。

提供了一些实现了driver包下的接口的结构体类型。

type [DB]

type DB struct {
    // 内含隐藏或非导出字段
}

方法有:

Exec()/Query()/Close()

type [Rows]

type Rows struct {
    // 内含隐藏或非导出字段
}

方法有:

Scan()/Next()/Columns()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!