内容简介:使用原生的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数据库操作方法集》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- selenium元素操作封装
- mongodb操作的模块手动封装
- 无依赖开发中的碰到的问题——封装DOM操作
- golang分布式存储 读书笔记(2)——流操作之PutStream封装
- 前端Vue: ElementUI 源码分析之dom.js样式操作的封装
- 使用 laravel-repository 扩展包实现对模型类操作的封装
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux内核设计与实现(原书第3版)
Robert Love / 陈莉君、康华 / 机械工业出版社华章公司 / 2011-4-30 / 69.00元
《Linux内核设计与实现(原书第3版)》详细描述了Linux内核的设计与实现。内核代码的编写者、开发者以及程序开发人员都可以通过阅读本书受益,他们可以更好理解操作系统原理,并将其应用在自己的编码中以提高效率和生产率。 《Linux内核设计与实现(原书第3版)》详细描述了Linux内核的主要子系统和特点,包括Linux内核的设计、实现和接口。从理论到实践涵盖了Linux内核的方方面面,可以满......一起来看看 《Linux内核设计与实现(原书第3版)》 这本书的介绍吧!