go orm庫(kù)開(kāi)發(fā)

gorm帶來(lái)數(shù)據(jù)庫(kù)操作的便捷深入人心,本文心血來(lái)潮簡(jiǎn)單編寫(xiě)一下基于go的數(shù)據(jù)庫(kù)操作類

package orm

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/syyongx/php2go"
)

type Db struct {
    Conn        *sql.DB
    sqlUrl      string
    Row         *sql.Rows
    table       string
    fetchSql    bool
    Sql         string
    data        interface{}
    option      map[string]interface{}
}

//創(chuàng)建mysql 連接
func (db *Db) NewMysqlConn(sqlUrl string) ( *Db, error) {
    var err error
    db.sqlUrl = sqlUrl
    db.Conn, err = sql.Open("mysql", db.sqlUrl)
    db.option = make(map[string]interface{})
    return db,err
}

//設(shè)置連接信息
func (db *Db)SetConnectUrl(sqlUrl string) *Db {
    db.sqlUrl = sqlUrl
    return db
}
//設(shè)置table
func (db *Db)Table(tableName string) *Db {
    db.table = tableName
    return db
}
//獲取返回值,獲取一條
func (db *Db) Get() map[string]string{
    db.Result()
    columns, _ := db.Row.Columns()
    scanArgs := make([]interface{}, len(columns))
    values := make([]interface{}, len(columns))
    for j := range values {
        scanArgs[j] = &values[j]
    }
    record := make(map[string]string)
    for db.Row.Next() {
        //將行數(shù)據(jù)保存到record字典
        db.Row.Scan(scanArgs...)
        for i, v := range values {
            if v != nil {
                record[columns[i]] = string(v.([]byte))
            }
        }
    }
    return record
}

//獲取所有
func (db *Db)dealResult() interface{} {
    res := db.Result()
    if db.fetchSql{
        return res
    }
    //返回所有列
    columns, _ := db.Row.Columns()
    //這里表示一行所有列的值,用[]byte表示
    vals := make([][]byte, len(columns))
    //這里表示一行填充數(shù)據(jù)
    scans := make([]interface{}, len(columns))
    //這里scans引用vals,把數(shù)據(jù)填充到[]byte里
    for k, _ := range vals {
        scans[k] = &vals[k]
    }
    i := 0
    result := make(map[int]map[string]string)
    for db.Row.Next() {
        //填充數(shù)據(jù)
        db.Row.Scan(scans...)
        //每行數(shù)據(jù)
        row := make(map[string]string)
        //把vals中的數(shù)據(jù)復(fù)制到row中
        for k, v := range vals {
            key := columns[k]
            //這里把[]byte數(shù)據(jù)轉(zhuǎn)成string
            row[key] = string(v)
        }
        //放入結(jié)果集
        result[i] = row
        i++
    }
    return result
}

//查詢
func (db *Db)Select() interface{} {
    return db.dealResult()
}

func (db *Db)Find() interface{} {
    res := db.dealResult()
    if db.fetchSql{
        return res
    }
    resMap := res.(map[int]map[string]string)
    return resMap[0]

}

//構(gòu)造sql
func (db *Db)BuildSql()  {
    if db.Sql == ""{
        field,where,order,limit := "*","","",""
        if db.option["field"] != nil{
            field = db.filedHandle()
        }

        if db.option["where"] != nil{
            where = db.whereHandle()
        }

        if db.option["order"] != nil{
            order = " order by " + db.option["order"].(string)
        }

        if db.option["limit"] != nil{
            limit = " limit " + db.option["limit"].(string)
        }
        db.Sql = "select " + field + " from " + db.table + where + order + limit
    }
}
//field處理
func (db *Db) filedHandle() string {
    t := fmt.Sprintf("%T", db.option["field"])
    var field string
    switch t {
        case "string":
            field = db.option["field"].(string)
        case "[]string":
            for _,v :=range db.option["field"].([]string){
                field += v + ","
            }
            field = php2go.Rtrim(",")
    }
    return field
}

//where處理
func (db *Db) whereHandle() string {
    where := " where"
    whereType := "and"
    for _,v :=range db.option["where"].([]map[string]string){
        for key,value :=range v {
            where += " `" + key + "`='" + value + "' " + whereType
        }
    }
    where = php2go.Rtrim(where,whereType)
    return where
}
//寫(xiě)入數(shù)據(jù)
func (db *Db)Data(data interface{}) *Db {
    db.data = data
    return db
}

//Where條件
func (db *Db)Where(where map[string]string) *Db {
    if db.option["where"] == nil{
        db.option["where"] = []map[string]string{}
    }
    db.option["where"] = append(db.option["where"].([]map[string]string),where)
    return db
}

//WhereIn條件
func (db *Db)WhereIn(filed string,value interface{}) *Db  {
    return db
}

//Where條件
func (db *Db)WhereOr(where interface{}) *Db {
    db.option["where"] = where
    return db
}

//執(zhí)行sql并返回結(jié)果
func (db *Db)Result() interface{} {
    var err error
    db.BuildSql()
    if db.fetchSql {
        return db.Sql
    }
    db.Row ,err = db.Conn.Query(db.Sql)
    if err != nil{
        panic(err)
    }
    return db
}

//直接執(zhí)行sql
func (db *Db)Query(sql string) interface{} {
    db.Sql = sql
    return db.Select()
}

//order處理
func (db *Db)Order(order string)*Db  {
    db.option["order"] = order
    return db
}

//limit處理
func (db *Db)Limit(start,offset string)*Db  {
    db.option["order"] = start + "," + offset
    return db
}


//打印生成的sql
func  (db *Db) FetchSql() *Db {
    db.fetchSql = true
    return db
}

使用示例

package main

import (
    "fmt"
    "gopro/orm"
)
//orm測(cè)試包
func main() {
    connectUrl := "root:root@tcp(127.0.0.1:3306)/test?charset=utf8"
    dbClass := orm.Db{}
    db,err := dbClass.NewMysqlConn(connectUrl)
    if err != nil{
        panic(err)
    }
    //result := db.Query("select * from teacher")
    where := make(map[string]string)
    where["id"] = "1"
    where["name"] = "老師2"
    whereTow := make(map[string]string)
    whereTow["name"] = "老師3"
    result := db.Table("teacher").Where(where).Where(whereTow).Order("id desc").FetchSql().Find();
    fmt.Println(result)
}

func describe(i interface{}) {
    x := fmt.Sprintf("%T",i)
    //fmt.Printf("(%v, %T)\n", i, i)
    fmt.Println(x)
}

查看結(jié)果

E:\project\gopro>go run main.go
select * from teacher where `id`='1' and `name`='老師2' and `name`='老師3'  order by id desc

db將持續(xù)更新,將支持豐富的where操作以及插入,批量插入 集合 鏈表等復(fù)雜查詢,敬請(qǐng)期待

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容