go-mysql,一個易用的mysql介面架構實現

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

介紹

go-mysql是一個用go寫的mysql driver,使用介面類似於go自身的database sql,但是稍微有一點不同,現階段還不支援整合進go database/sql中,但實現難度並不大,後續可能會接入。

go-mysql最先開始於mixer(一個用go實現的mysql proxy)中,隨著mixer的演化,我覺得有必要將其mysql模組獨立出來使用。對於mixer,後續我會詳細介紹。

為什麼要自己實現一套新的介面,而不是go自身的sql介面呢?最主要的原因在於我很不習慣使用Query的查詢方式。go自身的query例子:

age := 27rows, err := db.Query("SELECT name FROM users WHERE age=?", age)if err != nil {    log.Fatal(err)}for rows.Next() {    var name string    if err := rows.Scan(&name); err != nil {        log.Fatal(err)    }    fmt.Printf("%s is %d\n", name, age)}if err := rows.Err(); err != nil {    log.Fatal(err)}

可以看到,使用起來非常的繁瑣複雜,如果代碼裡面select語句很多(恰恰我們代碼裡面n多select),那麼如果每次select都要靠這種方式得到我們需要的結果,那我可能寫代碼會寫崩潰的。所以勢必我們需要提供一套封裝用來簡化select的結果集擷取。

Resultset

go-mysql跟go自身的sql介面最大的不一樣在於Query的時候直接返回了一個resultset,而這個resultset定義如下:

type Field struct {    Name []byte    Type uint8    Flag uint16}type Resultset struct {    Status uint16 //server status for this query resultset    Fields     []Field    FieldNames map[string]int    Data [][]interface{}}

Field用來表示查詢的時候返回的資料每列的名字,資料類型以及一些特定的Flag。而resultset中的Data則是存放了query結果中對於的實際資料。因為對於mysql select來說,它返回的是一個"m x n"的結果集,我們直接使用[][]interface{}在go中表示。

Resultset提供了非常方便的介面用於select資料的擷取:

//指定某一行,某一列擷取資料,結果為stringfunc (r *Resultset) GetString(row, column int) (string, error)//執行某一行,某一列的名字擷取資料,結果為stringfunc (r *Resultset) GetStringByName(row int, columnName int) (string, error)

介面

go-mysql除了query之外,幾乎提供了與go database/sql一樣的介面使用方式:

//建立一個db,最大允許保活16個空閑串連//dsn格式為:<username>:<password>@<host>:<port>/<database>db := NewDB("qing:admin@127.0.0.1:3306/mixer", 16)//ping一下,看mysql server是不是還是活的db.Ping()//執行exec,包括insert,update,delete,replacer, err := db.Exec("insert into mixer_conn (id, str) values (1, `abc`)")println(r.LastInsertId(), r.RowsAffected())//執行exec,語句中包含 ?預留位置,需要傳遞相應的參數r, err := db.Exec("insert into mixer_conn (id, str) values (?, ?)", 2, "efg")println(r.LastInsertId(), r.RowsAffected())//執行select,得到結果集,並擷取相關資料r, err := db.Query("select str from mixer_conn where id     = 1")str, _ = r.GetString(0, 0)str, _ = r.GetStringByName(0, "str")//開始一個事物tx, err = db.Begin()//在事物裡面執行語句tx.Exec("insert into mixer_conn (id, str) values (3, `abc`)")//提交事物tx.Commit()//建立一個prepare statements, err := db.Prepare("insert into mixer_conn (id, str) values(?, ?)")//執行 prepare statements.Exec(5, "abc")//關閉 prepare statements.Close()

不光如此,go-mysql還提供單獨擷取一個conn,用於給外部額外使用的功能,譬如:

conn, err := db.GetConn()//我需要設定conn的字元集為gb2312conn.SetCharset("gb2312")    conn.Close()

可以看到,go-mysql的使用非常簡單,現階段正逐漸在我們項目中使用,也非常期待您的反饋。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.