package dbquery import ( "database/sql" "log" "errors" "strings" "time" "git.tetele.net/tgo/helper" _ "github.com/go-sql-driver/mysql" ) /** * 创建数据 */ func Insert(dbName, table string, data map[string]string) (int64, error) { var insertId int64 var err error if dbName == "" && table == "" { return insertId, errors.New("没有数据表") } dbName = getTableName(dbName, table) if len(data) < 1 { return insertId, 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 := DB.Exec("insert into "+dbName+" ("+strings.Join(keyList, ",")+") value("+strings.Join(keyStr, ",")+")", valueList...) if err != nil { log.Println("ERROR|插入", dbName, "数据失败,", err) return insertId, err } else { insertId, _ = result.LastInsertId() time.Sleep(time.Second * 2) return insertId, nil } } /** * 修改数据 */ func Update(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|修改数据表", dbName, "时条件中有空数据,条件:", where, "数据:", data) return rowsAffected, errors.New("条件中有空数据") } result, err := DB.Exec("update "+dbName+" set "+strings.Join(keyList, " , ")+" where "+strings.Join(whereStr, " and "), valueList...) if err != nil { log.Println("ERROR|修改", dbName, "数据失败,", err) return rowsAffected, err } else { rowsAffected, _ = result.RowsAffected() return rowsAffected, nil } } /** * 删除数据 * @param count 删除数量 */ func Delete(dbName, table string, data 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(data) < 1 { return count, errors.New("没有要删除的数据") } keyList := make([]string, len(data)) valueList := make([]interface{}, len(data)) var i int = 0 empty := false for key, value := range data { if value == "" { empty = true break } keyList[i] = key + "=?" valueList[i] = value i++ } if empty { log.Println("ERROR|删除数据表", dbName, "时条件中有空数据,条件:", data) return count, errors.New("条件中有空数据") } var limitStr string = "" if len(del_count) > 0 { limitStr = " limit " + del_count[0] } result, err := DB.Exec("delete from "+dbName+" where "+strings.Join(keyList, " and ")+limitStr, valueList...) if err != nil { log.Println("ERROR|删除", dbName, "数据失败,", err) return count, err } else { count, _ = result.RowsAffected() return count, nil } } /** * 查找一条记录 * @param dbName 数据表名 * @param title 查询字段名 */ func GetData(dbName, table string, title string, where map[string]string, limit map[string]string) (int, map[string]string, error) { var count int = 0 info := make(map[string]string) if dbName == "" && table == "" { return count, info, errors.New("没有数据表") } dbName = getTableName(dbName, table) if len(title) < 1 { return count, info, errors.New("没有指定查询内容") } var limitStr string = "" if limit != nil && len(limit) > 0 { var from string = "0" //开始 if _, ok := limit["order"]; ok { limitStr += " order by " + limit["order"] } if _, ok := limit["from"]; ok { from = limit["from"] } limitStr += " limit " + from + ",1" } else { limitStr = " limit 1" } if len(where) < 1 { return count, info, errors.New("Query condition is empty") } 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 { return count, info, errors.New("Query condition is empty") } var rows *sql.Rows var err error var queryNum int = 0 for queryNum < 3 { //如发生错误,继续查询3次,防止数据库连接断开问题 rows, err = DB.Query("SELECT "+title+" FROM "+dbName+" where "+strings.Join(keyList, " and ")+" "+limitStr, valueList...) if err == nil { break } else { log.Println("ERROR", "Query from", dbName, "failed,", err, "| SELECT "+title+" FROM "+dbName+" where "+strings.Join(keyList, " and ")+" "+limitStr) time.Sleep(time.Millisecond * 500) } queryNum++ } defer rows.Close() if err != nil { return count, info, err } columns, _ := rows.Columns() scanArgs := make([]interface{}, len(columns)) values := make([]interface{}, len(columns)) for i := range values { scanArgs[i] = &values[i] } var index string var rowerr error for rows.Next() { rowerr = rows.Scan(scanArgs...) if rowerr == nil { for i, col := range values { if col != nil { index = helper.StrFirstToUpper(columns[i]) info[index] = helper.ToString(col) } } count++ } else { log.Println("ERROR", "rows scan error", rowerr, dbName, keyList, valueList) } } if rowerr != nil { return count, info, rowerr } return count, info, nil } func GetInfo(dbName, table string, title string, where map[string]string) (map[string]string, error) { count, info, gzErr := GetData(dbName, table, title, where, nil) if gzErr != nil { return info, gzErr } else { if count < 1 { return info, errors.New("No data") } return info, nil } } /** * 查询列表 * 2018/04/19 */ func GetList(dbName, table string, title string, where map[string]string, limit map[string]string) ([]map[string]string, error) { var list []map[string]string if dbName == "" && table == "" { return list, errors.New("没有数据表") } dbName = getTableName(dbName, table) var rows *sql.Rows var err error var queryNum int = 0 var limitStr string = "" if len(limit) > 0 { var offset string = "0" //偏移量,个数 var from string = "" //开始 if _, ok := limit["order"]; ok { limitStr += " order by " + limit["order"] } if _, ok := limit["offset"]; ok { offset = limit["offset"] } if _, ok := limit["from"]; ok { from = limit["from"] } if offset != "0" && from != "" { limitStr += " limit " + from + "," + offset } } if len(where) > 0 { valueList := make([]interface{}, len(where)) whereStr := make([]string, len(where)) i := 0 var keys []string for key, value := range where { key = strings.Trim(key, " ") value = strings.Trim(value, " ") if value == "" || key == "" { continue // return list, errors.New("Query condition is empty") } if strings.Contains(key, " ") { //key中包含空格,判断是否不等于条件 keys = strings.Split(key, " ") if helper.IsInStringArray(judg(), strings.Trim(keys[1], " ")) { whereStr[i] = strings.Trim(keys[0], " ") + " " + strings.Trim(keys[1], " ") + " ?" } } else { whereStr[i] = key + " = ?" valueList[i] = value } i++ } if len(whereStr) == 0 || len(valueList) == 0 { return list, errors.New("Query condition is empty") } for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题 rows, err = DB.Query("select "+title+" from "+dbName+" where "+strings.Join(whereStr, " and ")+" "+limitStr, valueList...) if err == nil { break } else { time.Sleep(time.Millisecond * 500) } queryNum++ } } else { for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题 rows, err = DB.Query("select " + title + " from " + dbName + " " + limitStr) if err == nil { break } else { time.Sleep(time.Millisecond * 500) } queryNum++ } } if err != nil { return list, err } defer rows.Close() columns, _ := rows.Columns() scanArgs := make([]interface{}, len(columns)) values := make([]interface{}, len(columns)) for i := range values { scanArgs[i] = &values[i] } var record map[string]string var index string for rows.Next() { //将行数据保存到record字典 err = rows.Scan(scanArgs...) record = make(map[string]string) for i, col := range values { if col != nil { index = helper.StrFirstToUpper(columns[i]) record[index] = helper.ToString(col) } } list = append(list, record) } return list, nil } /** * 查询总数 * 2018/04/19 */ func GetTotal(dbName, table string, args ...string) (total int) { if dbName == "" && table == "" { return } dbName = getTableName(dbName, table) var title string = "*" if len(args) > 0 { title = args[0] } var rows *sql.Rows var err error var queryNum int = 0 for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题 rows, err = DB.Query("select count(" + title + ") as count from " + dbName + " limit 1") if err == nil { break } else { time.Sleep(time.Millisecond * 500) } queryNum++ } if err != nil { log.Println("ERROR|get", dbName, "total error", err) return } defer rows.Close() var count int for rows.Next() { //将行数据保存到record字典 err = rows.Scan(&count) if err != nil { log.Println("ERROR|get", dbName, "total error", err) } else { total = count } } return } /** * 查询总数 * 2020/06/04 */ func GetCount(dbName, table string, where map[string]string, args ...string) (total int) { if dbName == "" && table == "" { return } dbName = getTableName(dbName, table) var title string = "*" if len(title) > 0 { title = args[0] } var rows *sql.Rows var err error var queryNum int = 0 if len(where) > 0 { valueList := make([]interface{}, len(where)) whereStr := make([]string, len(where)) i := 0 var keys []string for key, value := range where { key = strings.Trim(key, " ") value = strings.Trim(value, " ") if value == "" || key == "" { continue // return list, errors.New("Query condition is empty") } if strings.Contains(key, " ") { //key中包含空格,判断是否不等于条件 keys = strings.Split(key, " ") if helper.IsInStringArray(judg(), strings.Trim(keys[1], " ")) { whereStr[i] = strings.Trim(keys[0], " ") + " " + strings.Trim(keys[1], " ") + " ?" } } else { whereStr[i] = key + " = ?" valueList[i] = value } i++ } for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题 rows, err = DB.Query("select count("+title+") as count from "+dbName+" where "+strings.Join(whereStr, " and ")+" limit 1", valueList...) if err == nil { break } else { time.Sleep(time.Millisecond * 500) } queryNum++ } } else { for queryNum < 5 { //如发生错误,继续查询5次,防止数据库连接断开问题 rows, err = DB.Query("select count(" + title + ") as count from " + dbName + " limit 1") if err == nil { break } else { time.Sleep(time.Millisecond * 500) } queryNum++ } } if err != nil { log.Println("ERROR|get", dbName, "count error", err) return } defer rows.Close() var count int for rows.Next() { //将行数据保存到record字典 err = rows.Scan(&count) if err != nil { log.Println("ERROR|get", dbName, "count error", err) } else { total = count } } return } func DoQuery(args ...interface{}) ([]map[string]string, error) { var list []map[string]string if len(args) < 1 { return list, errors.New("Query condition is empty") } queryStr := helper.ToString(args[0]) if queryStr == "" { return list, errors.New("Query condition is empty") } var rows *sql.Rows var err error var queryNum int = 0 for queryNum < 3 { //如发生错误,继续查询5次,防止数据库连接断开问题 if len(args) > 1 { rows, err = DB.Query(queryStr, args[1:]...) //strings.Join(args[1:], ",") if err != nil { log.Println("ERROR|DoQuery error:", err) } } else { rows, err = DB.Query(queryStr) if err != nil { log.Println("ERROR|DoQuery error:", err) } } if err == nil { break } else { time.Sleep(time.Millisecond * 500) } queryNum++ } if err != nil { return list, err } defer rows.Close() columns, _ := rows.Columns() scanArgs := make([]interface{}, len(columns)) values := make([]interface{}, len(columns)) for i := range values { scanArgs[i] = &values[i] } var record map[string]string var index string for rows.Next() { //将行数据保存到record字典 err = rows.Scan(scanArgs...) record = make(map[string]string) for i, col := range values { if col != nil { index = helper.StrFirstToUpper(columns[i]) record[index] = helper.ToString(col) } } list = append(list, record) } return list, nil }