Golang運算元據庫

2021-09-23 01:33:47 字數 4123 閱讀 9481

注意:db並不是指的乙個connection

我們以mysql為例,使用github.com/go-sql-driver/mysql,首先我們需要匯入我們需要的包

注意我們匯入github.com/go-sql-driver/mysql 前面用了乙個"_",_操作其實是引入該包,而不直接使用包裡面的函式,而是呼叫了該包裡面的init函式,import的時候其實是執行了該包裡面的init函式,初始化了裡面的變數,_操作只是說該包引入了,我只初始化裡面的 init函式和一些變數,但是往往這些init函式裡面是註冊自己包裡面的引擎,讓外部可以方便的使用,就很多實現database/sql的包,在 init函式裡面都是呼叫了sql.register(name string, driver driver.driver)註冊自己,然後外部就可以使用了。

我們用open()函式來開啟乙個database handle

db, err := sql.open("mysql", "user:password@tcp(ip:port)/database")
寫乙個完整的:

//在這裡進行一些資料庫操作

defer db.close() }

我們在執行open函式的時候,並不會去獲得資料庫連線有效性,當執行資料庫操作的時候才會去連線,當我們需要在open之後就知道連線的有效性的時候,可以通過ping()來進行

err = db.ping()

if err != nil 

我們通常習慣使用close來關閉資料庫連線,但是sql.db是被設計成長期有效的型別,我們不應該頻繁的open和close,相反,我們應該建立乙個sql.db,在程式需要進行資料庫操作的時候一直使用它,不要在乙個方法裡面進行open和close,應該把sql.db作為引數傳遞給方法

exec()方法一般用於增刪改操作,這裡以增加為例:

stmt, err := db.prepare(

"insert into user(name,age)values(?,?)

")

if err != nil 

rs, err := stmt.exec(

"go-test

", 12)

if err != nil 

//我們可以獲得插入的id

id, err := rs.lastinsertid()

//可以獲得影響行數

affect, err := rs.rowsaffected()

查詢操作

一般的查詢

var name string

var age int

rows, err := db.query("

select name,age from user where id = ? 

", 1)

if err != nil 

defer rows.close()

for rows.next() 

}err = rows.err()

if err != nil 

fmt.println("

name:

", url, "

age:

", description)

我們應該養成關閉rows的習慣,在任何時候,都不要忘記rows.close().哪怕這個rows在確實迴圈完之後,已經自動關閉掉了,我們定義rows.close()也是對我們沒有壞處的,因為我們無法保證,rows是否會正常的迴圈完。

查詢單條記錄,

我們使用db.queryrow()

var name string

err = db.queryrow(

"select name from user where id = ?

", 222).scan(&name)

沒有結果的時候會返回err

處理空值

我們用乙個name欄位為空的記錄來舉例

var name nullstring

err := db.queryrow(

"select name from names where id = ?

", id).scan(&name)

if name.valid  

else 

在這種情況下我們通常使用nullstring,但是有時候我們並不關心值是不是null,我們只需要吧他當乙個空字串來對待就行。這時候我們可以使用byte(null byte可以轉化為空string) 或者 sql.rawbytes,

var col1, col2 byte

for rows.next() 

// use the string value

fmt.println(string(col1), string(col2)) }

使用*sql.rawbytes

事務

使用db.begin()來開啟乙個事務, 通過commit()和rollback()方法來關閉。

tx := db.begin()

tx.rollback()

tx.commit()

exec, query, queryrow and prepare 方法已經全部可以在tx上面使用。使用方法和在*sql.db是一樣的,事務必須以commit()或者rollback()結束

在database/sql中有乙個很基本的連線池,你並沒有多大的控制權,僅僅可以設定setmaxidleconns和setmaxopenconns,也就是最大空閒連線和最大連線數。

db.setmaxidleconns(n)

db.setmaxopenconns(n)

Golang運算元據庫

基本概念 open creates a db close closes the db query 查詢 queryrow 查詢行 exec 執行操作,update,insert,delete row a row is not a hash map,but an abstraction of a cu...

Golang運算元據庫

注意 db並不是指的乙個connection 我們以mysql為例,使用github.com go sql driver mysql,首先我們需要匯入我們需要的包 注意我們匯入github.com go sql driver mysql 前面用了乙個 操作其實是引入該包,而不直接使用包裡面的函式,而...

運算元據庫

python importmysqldb defmydbtest conn mysqldb.connect host localhost user root passwd sa db b4img charset utf8 cursor conn.cursor sql select from imag...