本身封裝的golang 操做數據庫方法

這個是我用Go寫的第一個東東,可能還存在些BUG沒有測試到。這裏主要是提供一個參考。各位能夠改寫成本身的風格。

      在命令行下輸入以下兩條命令,進行安裝 mysql

go get github.com/male110/SimpleDb
        go install github.com/male110/SimpleDb

Go語言的數據庫操做,只能用Rows.Scan來一次性讀取全部列。感受很不習慣,我仍是習慣按照列名來一列列的取數據。因此我本身封裝了一個數據結構MyRows,MyRows實現了一個函數,GetValue(name string, value interface{})能夠按列名來取數據。以下所示: git

err = rows.GetValue("IsBoy", &isBoy)
        if err != nil {
            fmt.Println(err)
            return
        }

    爲了操做方便,還定義了其它的結構體,如MyDb,其Query函數能夠直接返回 MyRows。NewDb用來建立MyDb結構,其參數與sql.Open一至,怎麼傳取決於你所使用的驅動程序。 github

db, err := SimpleDb.NewDb("mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8")
    if err != nil {
        fmt.Println("打開SQL時出錯:", err.Error())
        return
    }
    var rows *SimpleDb.MyRows
    //從數據庫中取數據
    rows, err = db.Query("select * from person")
    if err != nil {
        fmt.Println(err)
        return
    }
    //顯示數據
    for rows.Next() {
        var id, age int
        var name string
        var isBoy bool
        //按字段名取數據,也能夠用rows.Scan(&id,&name,&age),來取
        rows.GetValue("id", &id)
        rows.GetValue("name", &name)

        rows.GetValue("age", &age)
        //能夠根據返回值,判斷是否成功
        err = rows.GetValue("IsBoy", &isBoy)
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(id, "\t", name, "\t", age, "\t", isBoy)
    }

        同時還時現了一個簡單的ORM,實現了最基本的插入數據,修改數據,刪除數據。 我通常使用ORM只用這麼幾個方法,其它的都是寫SQL語句。這裏只是一個參考,你們能夠根據本身的須要,本身習慣,進行修改。改爲本身須要的格式。數據結構的定義格式以下: sql

type Person struct {
    /*TableName類型只是用來設置表名。若是結構體名跟表名相同能夠省略*/
    TableName SimpleDb.TableName "person"

    /*name是表名,PK用來設置是否主鍵,true主鍵,false非主鍵*/
    Id int `name:"id"PK:"true"Auto:"true"`

    Name   string "name" //tag裏的name表是對應的字段名
    Age    int    "age"  //tag裏的age表是對應的字段名
    IsBoy  bool
    NotUse string "-" //-不會保存到數據庫中
}

      上面的說明已經很詳細了, SimpleDb.TableName類型的字段,只用來在tag中定義結構體對應的表名,若是沒有該字段,認爲表名就是結構體名相同。 PK:"true"表示是主鍵,Auto:"true"表示該字段是自動增加的列,name:"id",來指定該字段對應的數據表中的列名,如不指定認爲 跟字段名相同。當只須要指定列名時,能夠直接寫在tag中,如:"name"、"age"。tag爲"-"表示不對應數據表中的任何列。 數據庫

// 插入數據
p := &Person{Name: "張三丰", Age: 500, IsBoy: true}
db.Insert(p)
//修改數據
db.Update(p)
//刪除數據
db.Delete(p)

下面來看一個完整的例子,首先他創表: 數組

CREATE TABLE `person` (
    `id` INT(50) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NULL DEFAULT NULL,
    `age` INT(50) NULL DEFAULT NULL,
    `IsBoy` SMALLINT(10) NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';

insert into `person` (name,age,IsBoy) values('張三',20,0);
insert into `person` (name,age,IsBoy) values('王五',19,1);

下面是完整的代碼 數據結構

package main

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/male110/SimpleDb"
)

type Person struct {
    /*TableName類型只是用來設置表名。若是結構體名跟表名相同能夠省略*/
    TableName SimpleDb.TableName "person"

    /*name是表名,PK用來設置是否主鍵,true主鍵,false非主鍵*/
    Id int `name:"id"PK:"true"Auto:"true"`

    Name   string "name" //tag裏的name表是對應的字段名
    Age    int    "age"  //tag裏的age表是對應的字段名
    IsBoy  bool
    NotUse string "-" //-不會保存到數據庫中
}

func main() {
    db, err := SimpleDb.NewDb("mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8")
    if err != nil {
        fmt.Println("打開SQL時出錯:", err.Error())
        return
    }
    defer db.Close()
    p := &Person{Name: "張三丰", Age: 500, IsBoy: true}
    //插入一條數據
    err = db.Insert(p)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("新插入數據的ID:", p.Id)
    var rows *SimpleDb.MyRows
    //從數據庫中取數據
    rows, err = db.Query("select * from person")
    if err != nil {
        fmt.Println(err)
        return
    }
    //顯示數據
    for rows.Next() {
        var id, age int
        var name string
        var isBoy bool
        //按字段名取數據,也能夠用rows.Scan(&id,&name,&age),來取
        rows.GetValue("id", &id)
        rows.GetValue("name", &name)

        rows.GetValue("age", &age)
        //能夠根據返回值,判斷是否成功
        err = rows.GetValue("IsBoy", &isBoy)
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(id, "\t", name, "\t", age, "\t", isBoy)
    }
    //輸出分割線
    fmt.Println("==========割割割割割割割割============")
    p.Name = "彭祖"
    p.Age = 800
    //修改數據
    _, err = db.Update(p)
    if err != nil {
        fmt.Println(err, "xxxx")
        return
    }
    //QueryDataRows返回一個DataRow數組,DataRow中有一map來存放行中的數據
    var arrRow []SimpleDb.DataRow
    arrRow, err = db.QueryDataRows("select * from person")
    if err != nil {
        fmt.Println(err, "zzzzz")
        return
    }
    for _, row := range arrRow {
        var id, age int
        var name string
        var isBoy bool
        //只能按字段名取數據
        row.GetValue("id", &id)
        row.GetValue("name", &name)
        row.GetValue("age", &age)
        //能夠根據返回值,判斷是否成功
        err = rows.GetValue("IsBoy", &isBoy)
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(id, "\t", name, "\t", age, isBoy)
    }
    var p2 Person
    p2.Id = p.Id
    //根據主鍵從數據庫中取單條數據
    err = db.Load(&p2)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(p2)
    //根據主鍵刪除一條數據
    db.Delete(p2)
}
相關文章
相關標籤/搜索