1. 程式人生 > 實用技巧 >Go語言Database/Sql操作

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