Using native Golang for database crud feels a lot of the same, so referencing the customary usage of database classes before,
encapsulates a set of database action methods:
Package Libimport ("Database/sql" _ "Github.com/go-sql-driver/mysql" "Strings" "FMT") type Dbrow map[string]in Terface{}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: = Do ([]interface{}, Len (Columns)) for I: = Range V als {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}//gets a row of records 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}//gets multiline record 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}//write record func (d *dblib) Insert (table string, Data Dbrow) (Int64, Error) {fields: = Make ( []string, 0) Vals: = Make ([]interface{}, 0) PlaceHolder: = Do ([]string, 0) for F, V: = Range Data {Fiel ds = 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}//update record func (d *dblib) update (table, Condit Ion 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 = FM t.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}//Delete record func (d *dblib) Delete (table, Condit Ion string, args ... interface{}) (Int64, error) {sql: = "DELETE from%s" If condition! = "" {SQL + = "WHERE%s" sql = Fmt.s printf (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}