|
|
- /**
- * DB transaction
- */
- package dbquery
-
- import (
- "database/sql"
- "errors"
- "log"
- "strings"
- "time"
- )
-
- /**
- * 创建数据
- */
- func TxInsert(tx *sql.Tx, dbname, table string, data map[string]string) (int64, error) {
-
- var insertId int64
- var err error
- if dbname == "" && table == "" {
- return 0, errors.New("参数错误,没有数据表")
- }
- dbName := getTableName(dbname, table)
- if len(data) < 1 {
- return 0, errors.New("参数错误,没有要写入的数据")
- }
-
- keyList := make([]string, len(data))
- keyStr := make([]string, len(data))
- valueList := make([]interface{}, len(data))
-
- var i int = 0
-
- for key, value := range data {
- keyList[i] = key
- keyStr[i] = "?"
- valueList[i] = value
- i++
- }
-
- result, err := tx.Exec("insert into "+dbName+" ("+strings.Join(keyList, ",")+") value("+strings.Join(keyStr, ",")+")", valueList...)
-
- if err != nil {
- log.Println("ERROR", "insert into ", dbName, "error:", err)
- return insertId, err
- } else {
- insertId, _ = result.LastInsertId()
- time.Sleep(time.Second * 2)
- return insertId, nil
- }
-
- }
-
- /**
- * 准备写入
- * return Stmt error
- */
- func TxPreInsert(tx *sql.Tx, dbname, table string, data map[string]interface{}) (int64, error) {
-
- if dbname == "" && table == "" {
- return 0, errors.New("params error,no db or table")
- }
-
- dbName := getTableName(dbname, table)
-
- if len(data) < 1 {
- return 0, errors.New("params error,no data to insert")
- }
-
- var err error
-
- var stmt *sql.Stmt
-
- var field []string = make([]string, len(data))
- var valuelist []interface{} = make([]interface{}, len(data))
-
- var i int = 0
- for key, item := range data {
- field[i] = key + "=?"
- valuelist[i] = item
- i++
- }
-
- sql := "insert into " + dbName + " set " + strings.Join(field, " , ")
- stmt, err = tx.Prepare(sql)
-
- if err != nil {
- log.Println("insert prepare error:", sql, err)
- return 0, errors.New("insert prepare error:" + err.Error())
- }
- result, err := stmt.Exec(valuelist...)
- if err != nil {
- log.Println("insert exec error:", sql, valuelist, err)
- return 0, errors.New("insert exec error:" + err.Error())
- }
- insertId, _ := result.LastInsertId()
- return insertId, nil
-
- }
-
- /**
- * 修改数据
- */
- func TxUpdate(tx *sql.Tx, dbname, table string, data map[string]string, where map[string]string) (int64, error) {
- var rowsAffected int64
- var err error
- if dbname == "" && table == "" {
- return rowsAffected, errors.New("参数错误,没有数据表")
- }
- dbName := getTableName(dbname, table)
- if len(data) < 1 {
- return rowsAffected, errors.New("参数错误,没有要写入的数据")
- }
- if len(where) < 1 {
- return rowsAffected, errors.New("参数错误,没有修改条件")
- }
-
- keyList := make([]string, len(data))
- valueList := make([]interface{}, len(data), len(data)+len(where))
-
- whereStr := make([]string, len(where))
-
- var i int = 0
-
- empty := false
-
- for key, value := range data {
- keyList[i] = key + "=?"
- valueList[i] = value
- i++
- }
- i = 0
- for key, value := range where {
- if value == "" {
- empty = true
- break
- }
- whereStr[i] = key + "=?"
- valueList = append(valueList, value)
- i++
- }
-
- if empty {
- log.Println("ERROR", "update", dbName, "error, params empty")
- return rowsAffected, errors.New("params empty")
- }
- result, err := tx.Exec("update "+dbName+" set "+strings.Join(keyList, " , ")+" where "+strings.Join(whereStr, " and "), valueList...)
-
- if err != nil {
- log.Println("ERROR", "update", dbName, "error:", err)
- return rowsAffected, err
- } else {
- rowsAffected, _ = result.RowsAffected()
- return rowsAffected, nil
- }
-
- }
-
- /**
- * 准备更新
- * return Stmt error
- */
- func TxPreUpdate(tx *sql.Tx, dbname, table string, data []string, where []string, valuelist []interface{}) (int64, error) {
-
- if dbname == "" && table == "" {
- return 0, errors.New("params error,no db or table")
- }
-
- dbName := getTableName(dbname, table)
-
- if len(where) < 1 {
- return 0, errors.New("params error, no data for update")
- }
-
- var err error
-
- var stmt *sql.Stmt
-
- sql := "update " + dbName + " set " + strings.Join(data, " , ") + " where " + strings.Join(where, " and ")
-
- stmt, err = tx.Prepare(sql)
-
- if err != nil {
- log.Println("update prepare error:", sql, err)
- return 0, errors.New("update prepare error:" + err.Error())
- }
- res, err := stmt.Exec(valuelist...)
- if err != nil {
- log.Println("update exec error:", sql, valuelist, err)
- return 0, errors.New("update exec error:" + err.Error())
- }
-
- return res.RowsAffected()
- }
-
- /**
- * 删除数据
- * @param count 删除数量
- */
- func TxDelete(tx *sql.Tx, dbname, table string, where map[string]string, del_count ...string) (int64, error) {
- var count int64
- var err error
- if dbname == "" && table == "" {
- return count, errors.New("参数错误,没有数据表")
- }
- dbName := getTableName(dbname, table)
-
- if len(where) < 1 {
- return count, errors.New("参数错误,没有删除条件")
- }
- keyList := make([]string, len(where))
- valueList := make([]interface{}, len(where))
-
- var i int = 0
-
- empty := false
- for key, value := range where {
- if value == "" {
- empty = true
- break
- }
- keyList[i] = key + "=?"
- valueList[i] = value
- i++
- }
-
- if empty {
- log.Println("ERROR", "delete from", dbName, "error, where:", where)
- return count, errors.New("params empty")
- }
-
- var limitStr string = ""
-
- if len(del_count) > 0 {
- limitStr = " limit " + del_count[0]
-
- }
- result, err := tx.Exec("delete from "+dbName+" where "+strings.Join(keyList, " and ")+limitStr, valueList...)
-
- if err != nil {
- log.Println("ERROR", "delete from", dbName, "error:", err)
- return count, err
- } else {
- count, _ = result.RowsAffected()
- return count, nil
- }
-
- }
-
- /**
- * 准备查询
- * return Stmt error
- */
- func TxForRead(tx *sql.Tx, dbName, table string, title string, where []string) (*sql.Stmt, error) {
-
- if dbName == "" && table == "" {
- return nil, errors.New("参数错误,没有数据表")
- }
-
- dbName = getTableName(dbName, table)
-
- if len(title) < 1 {
- return nil, errors.New("没有要查询内容")
- }
-
- var stmt *sql.Stmt
- var err error
-
- if len(where) > 0 {
- // log.Println("SELECT " + title + " FROM " + dbName + " where " + strings.Join(where, " and ") + " FOR UPDATE")
- stmt, err = tx.Prepare("SELECT " + title + " FROM " + dbName + " where " + strings.Join(where, " and ") + " FOR UPDATE")
- } else {
- // log.Println("SELECT " + title + " FROM " + dbName + " FOR UPDATE")
- stmt, err = tx.Prepare("SELECT " + title + " FROM " + dbName + " FOR UPDATE")
- }
-
- return stmt, err
- }
-
- /**
- * 使用db prepare方式查询单条数据
- * @param dbName
- * @param title 查询的字段名
- * @param where 查询条件
- * @param valuelist 查询的条件值
- * @param limit 查询排序
- * GZ
- * 2020/05/19
- */
- func TxGetData(tx *sql.Tx, dbName string, table string, title string, where []string, valuelist []interface{}) (map[string]string, error) {
-
- stmt, err := TxForRead(tx, dbName, table, title, where)
-
- if err != nil {
- return nil, err
- }
- defer stmt.Close()
-
- return StmtForQueryRow(stmt, valuelist)
- }
|