一个封装的Goland数据库操作方法集

栏目: 数据库 · Mysql · 发布时间: 6年前

内容简介:使用原生的Golang进行数据库CRUD感觉到诸多不变,于是参照之前使用数据库类的习惯用法,封装了一个数据库操作方法集:

使用原生的Golang进行数据库CRUD感觉到诸多不变,于是参照之前使用数据库类的习惯用法,

封装了一个数据库操作方法集:

package lib

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

type dbRow map[string]interface{}

type Dblib struct {
    db *sql.DB
}

func NewDblib(driver, dsn string) (*Dblib, error) {
    db, err := sql.Open(driver, dsn)
    if err != nil {
        return nil, err
    }

    err = db.Ping()
    if err != nil {
        return nil, err
    }

    p := new(Dblib)
    p.db = db
    return p, nil
}

func scanRow(rows *sql.Rows) (dbRow, error) {
    columns, _ := rows.Columns()

    vals := make([]interface{}, len(columns))
    valsPtr := make([]interface{}, len(columns))

    for i := range vals {
        valsPtr[i] = &vals[i]
    }

    err := rows.Scan(valsPtr...)

    if err != nil {
        return nil ,err
    }

    r := make(dbRow)

    for i, v := range columns {
        if va, ok := vals[i].([]byte); ok {
            r[v] = string(va)
        } else {
            r[v] = vals[i]
        }
    }

    return r, nil

}

// 获取一行记录
func (d *Dblib) GetOne(sql string, args ...interface{}) (dbRow, error) {
    rows, err := d.db.Query(sql, args...)
    if err != nil {
        return nil, err
    }

    defer rows.Close()
    rows.Next()
    result, err := scanRow(rows)
    return result, err
}

// 获取多行记录
func (d *Dblib) GetAll(sql string, args ...interface{}) ([]dbRow, error) {
    rows, err := d.db.Query(sql, args...)
    if err != nil {
        return nil, err
    }

    defer rows.Close()

    result := make([]dbRow, 0)

    for rows.Next() {
        r, err := scanRow(rows)
        if err != nil {
            continue
        }

        result = append(result, r)
    }

    return result, nil

}

// 写入记录
func (d *Dblib) Insert(table string, data dbRow) (int64, error) {
    fields := make([]string, 0)
    vals := make([]interface{}, 0)
    placeHolder := make([]string, 0)

    for f, v := range data {
        fields = append(fields, f)
        vals = append(vals, v)
        placeHolder = append(placeHolder, "?")
    }

    sql := fmt.Sprintf("INSERT INTO %s(%s) VALUES(%s) ", table, strings.Join(fields, ","), strings.Join(placeHolder, ","))
    result, err := d.db.Exec(sql, vals...)
    if err != nil {
        return 0, err
    }

    lID, err := result.LastInsertId()
    if err != nil {
        return 0, err
    }

    return lID, nil
}

// 更新记录
func (d *Dblib) Update(table, condition string, data dbRow, args ...interface{}) (int64, error) {
    params := make([]string, 0)
    vals := make([]interface{}, 0)

    for f, v := range data {
        params = append(params, f + "=?")
        vals = append(vals, v)
    }

    sql := "UPDATE %s SET %s"
    if condition != "" {
        sql += " WHERE %s"
        sql = fmt.Sprintf(sql, table, strings.Join(params, ","), condition)
        vals = append(vals, args...)
    } else {
        sql = fmt.Sprintf(sql, table, strings.Join(params, ","))
    }

    result, err := d.db.Exec(sql, vals...)
    if err != nil {
        return 0, err
    }

    aID, err := result.RowsAffected()
    if err != nil {
        return 0, err
    }

    return aID, nil
}

// 删除记录
func (d *Dblib) Delete(table, condition string, args ...interface{}) (int64, error) {
    sql := "DELETE FROM %s "
    if condition != "" {
        sql += "WHERE %s"
        sql = fmt.Sprintf(sql, table, condition)
    } else {
        sql = fmt.Sprintf(sql, table)
    }

    result, err := d.db.Exec(sql, args...)
    if err != nil {
        return 0, err
    }

    aID, err := result.RowsAffected()
    if err != nil {
        return 0, err
    }

    return aID, nil

}

以上所述就是小编给大家介绍的《一个封装的Goland数据库操作方法集》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精通Web Analytics 2.0

精通Web Analytics 2.0

[美]Avinash Kaushik / 郑海平、邓天卓 / 清华大学出版社 / 2011-4-26 / 48.00元

向数据驱动型决策转变以及如何利用网站数据来获得竞争优势 在过去几年中,互联网、在线营销以及广告经历了巨大的变革,然而大家处理数据的方式跟几十年前相比还是大同小异,停滞不前。网站分析领域的领跑者Analytics kaushik通过《精通Web Analytics 2.0——用户中心科学与在线统计艺术》提出了下一代网站分析的框架,将能很大程度地帮助你提高组织的能动性和对市场的反应速度。 ......一起来看看 《精通Web Analytics 2.0》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器