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()等