Go語言Database/Sql操作
阿新 • • 發佈:2020-11-25
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()等