zoukankan      html  css  js  c++  java
  • 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()等
    
  • 相关阅读:
    POJ1125 Stockbroker Grapevine(spfa枚举)
    20160402javaweb 开发模式
    20160331javaweb之JSP 标签技术
    20160331javaweb之JSP include 指令&&九大隐式对象
    20160330javaweb之session 小练习
    20160329javaweb之JSP -session入门
    20160329javaweb之JSP -cookie入门
    20160328 javaweb Cookie 小练习
    20160327javaweb 之JSP入门
    HttpServlet was not found on the Java
  • 原文地址:https://www.cnblogs.com/cgl-dong/p/14035054.html
Copyright © 2011-2022 走看看