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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM