标签:变量 root 编程 time 读写 data HERE ted 注册
当第三方开发者开发数据库驱动时,都会实现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 是一个数据库驱动的接口,他定义了一个 method: Open (name string),这个方法返回一个数据库的 Conn 接口。
type Driver interface {
Open(name string)(Conn,error)
}
Conn是一个数据库连接的接口定义,他定义了一系列方法,这个Conn只能应用在一个goroutine里面。
type Conn interface {
Prepare(query string)(Stmt,error)
Close() error
Begin() (Tx,error)
}
Prepare函数返回与当前连接相关的Sql语句的准备状态。
Close函数关闭当前的连接,执行释放连接用于的资源等清理工作。
Begin函数返回一个代表事务处理的Tx。
Stmt是一种准备好的状态,和Conn相关联,并且只能用于一个goroutine中。
type Stmt interface {
Close() error
NumInput() int
Exec(args []Value)(Result,error)
Query(args []Value)(Rows,error)
}
事务处理一般就两个过程,递交或者回滚。
type Tx interface{
Commit() error
Rollback() error
}
这两个函数一个用来递交一个事务,一个用来回滚事务。
这是一个Conn可选择实现的接口
type Execer interface{
Exec(query string,args []Value)(Result,error)
}
这个是执行Updata/insert等操作返回的结果接口定义
type Result interface{
LastInsertId()(int64,err)
RowsAffected()(int64,err)
}
LastInsertId返回的是由插入操作得到的自增ID号,
RowsAffected函数返回query操作影响的数据条目数。
Rows是执行查询返回的结果集接口廷议
type Rows interface {
Columns()[]string
Close() error
Next(dest []Value)error
}
Value是一个空接口,他可以容纳任何的数据
type Value interface{}
drive的Value是驱动必须能够操作的Value,Value要么是nile,要么是下面的任意一种:
int64
float64
bool
[]byte
string [*]除了Row.Next返回的不能是string
time.Time
ValueConverter接口定义了如何把一个普通的值转化成driver.Value的接口
type ValueConverter interface{
ConverValue(v interface{})(Value,error)
}
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准备好的语句。
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")
github.com/lib/pq 支持 database/sql 驱动,纯 Go 写的
github.com/jbarham/gopgsqldriver 支持 database/sql 驱动,纯 Go 写的
github.com/lxn/go-pgsql 支持 database/sql 驱动,纯 Go 写的
采用了 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主要由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是一个高性能,开源,无模式的文档性数据库。
标签:变量 root 编程 time 读写 data HERE ted 注册
原文地址:https://www.cnblogs.com/Gumi-o/p/14766170.html