码迷,mamicode.com
首页 > 数据库 > 详细

GO Web编程(五——访问数据库)

时间:2021-05-24 08:24:40      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:变量   root   编程   time   读写   data   HERE   ted   注册   

database/sql接口

  • sql.Register函数

当第三方开发者开发数据库驱动时,都会实现init函数,在init里面会调用这个Register(name string,driver driver.Driver)完成驱动的注册。

mysql驱动:

// https://github.com/mikespook/mymysql 驱动
// Driver automatically registered in database/sql
var d = Driver{proto: "tcp", raddr: "127.0.0.1:3306"}
func init() {
    Register("SET NAMES utf8")
    sql.Register("mymysql", &d)
}

在database/sql内部通过一个Map来存储用户定义的相应驱动。

var drivers = make(map[string]driver.Driver)
driver[name] = driver

在使用Database/sql接口和第三方库是经常看到:

import (
	"database/sql"
    _ "github.com/mattn/go-sqlite3"
)

_引入的包不直接使用包中定义的函数或变量等资源,但是包在引入的时候回自动调用包的init函数完成对包的初始化,因此,引入上面的数据库驱动包之后会自动去调用init函数,然后在init函数里面注册这个数据库驱动,这样就可以在接下来的代码中直接使用这个数据库驱动了。

  • driver.Driver

Driver 是一个数据库驱动的接口,他定义了一个 method: Open (name string),这个方法返回一个数据库的 Conn 接口。

type Driver interface {
    Open(name string)(Conn,error)
}
  • driver.Conn

Conn是一个数据库连接的接口定义,他定义了一系列方法,这个Conn只能应用在一个goroutine里面。

type Conn interface {
    Prepare(query string)(Stmt,error)
    Close() error
    Begin() (Tx,error)
}

Prepare函数返回与当前连接相关的Sql语句的准备状态。

Close函数关闭当前的连接,执行释放连接用于的资源等清理工作。

Begin函数返回一个代表事务处理的Tx。

  • driver.Stmt

Stmt是一种准备好的状态,和Conn相关联,并且只能用于一个goroutine中。

type Stmt interface {
    Close() error
    NumInput() int
    Exec(args []Value)(Result,error)
    Query(args []Value)(Rows,error)
}
  • driver.Tx

事务处理一般就两个过程,递交或者回滚。

type Tx interface{
    Commit() error
    Rollback() error
}

这两个函数一个用来递交一个事务,一个用来回滚事务。

  • driver.Execer

这是一个Conn可选择实现的接口

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

这个是执行Updata/insert等操作返回的结果接口定义

type Result interface{
    LastInsertId()(int64,err)
    RowsAffected()(int64,err)
}

LastInsertId返回的是由插入操作得到的自增ID号,

RowsAffected函数返回query操作影响的数据条目数。

  • driver.Rows

Rows是执行查询返回的结果集接口廷议

type Rows interface {
    Columns()[]string
    Close() error
    Next(dest []Value)error
}
  • driver.Value

Value是一个空接口,他可以容纳任何的数据

type Value interface{}

drive的Value是驱动必须能够操作的Value,Value要么是nile,要么是下面的任意一种:

int64
float64
bool
[]byte
string [*]除了Row.Next返回的不能是string
time.Time
  • driver.ValueConverter

ValueConverter接口定义了如何把一个普通的值转化成driver.Value的接口

type ValueConverter interface{
    ConverValue(v interface{})(Value,error)
}

使用Mysql数据库

  • Mysql驱动

github.com/go-sql-driver/mysql 支持 database/sql,全部采用 go 写。github.com/ziutek/mymysql 支持 database/sql,也支持自定义的接口,全部采用 go 写。github.com/Philio/GoMySQL 不支持 database/sql,自定义接口,全部采用 go 写。

————————————————

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 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)
    }
}

db, err := sql.Open("mysql", "astaxie:astaxie@/test?charset=utf8")

sql.Open()函数用来打开一个注册过的数据库驱动,第二个参数时DSN(Database 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准备好的语句。

使用SQLite数据库

github.com/mattn/go-sqlite3 支持 database/sql 接口,基于 cgo 写的
github.com/feyeleanor/gosqlite3 不支持 database/sql 接口,基于 cgo 写的
github.com/phf/go-sqlite3 不支持 database/sql 接口,基于 cgo 写的

sqllite实现Database/sql接口的代码与mysql几乎是一模一样的,只有sql.Open不一样采用了SQLite的方式打开。

db, err := sql.Open("sqlite3", "./foo.db")
  • PostgreSQL驱动

github.com/lib/pq 支持 database/sql 驱动,纯 Go 写的
github.com/jbarham/gopgsqldriver 支持 database/sql 驱动,纯 Go 写的
github.com/lxn/go-pgsql 支持 database/sql 驱动,纯 Go 写的

Beego Orm库

采用了 Go style 方式对数据库进行操作,实现了 struct 到数据表记录的映射。

支持的驱动:

Mysql: github/go-mysql-driver/mysql
PostgreSQL: github.com/lib/pq
SQLite: github.com/mattn/go-sqlite3
Mysql: github.com/ziutek/mymysql/godrv

  • 安装
go get github.com/astaxie/beego
  • 初始化
import (
    "database/sql"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

func init() {
    // 注册驱动
    orm.RegisterDriver("mysql", orm.DR_MySQL)
    // 设置默认数据库
    orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30)
    // 注册定义的 model
    orm.RegisterModel(new(User))

    // 创建 table
    orm.RunSyncdb("default", false, true)
}
o := orm.NewOrm()

使用原生Sql

o := orm.NewOrm()
var r orm.RawSeter
r = o.Raw("UPDATE user SET name = ? WHERE name = ?","testing","slene")
  • Nosql

目前主要流行的NOSQL主要由redis、mongoDB、Cassandra和Membase等。

这些数据库都有高性能、高并发读写等特点。

redis:

redis是一个key-value的存储系统,go支持的redis驱动:

github.com/gomodule/redigo (推荐)
github.com/go-redis/redis
github.com/hoisie/redis
github.com/alphazero/Go-Redis
github.com/simonz05/godis

MongoDB:

mongodb是一个高性能,开源,无模式的文档性数据库。

GO Web编程(五——访问数据库)

标签:变量   root   编程   time   读写   data   HERE   ted   注册   

原文地址:https://www.cnblogs.com/Gumi-o/p/14766170.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!