github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgSql/Functions.go (about)

     1  package kmgSql
     2  
     3  import (
     4  	"database/sql"
     5  	"fmt"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"github.com/bronze1man/kmg/kmgSql/MysqlAst"
    10  	"github.com/bronze1man/kmg/kmgStrconv"
    11  )
    12  
    13  func MustQuery(query string, args ...string) []map[string]string {
    14  	out, err := GetDb().DbQueryer.Query(query, args...)
    15  	if err != nil {
    16  		panic(err)
    17  	}
    18  	return out
    19  }
    20  
    21  func Query(query string, args ...string) (output []map[string]string, err error) {
    22  	return GetDb().DbQueryer.Query(query, args...)
    23  }
    24  
    25  func (q DbQueryer) Query(query string, args ...string) (output []map[string]string, err error) {
    26  	rows, err := q.SqlQueryer.Query(query, argsStringToInterface(args...)...)
    27  	if err != nil {
    28  		return nil, fmt.Errorf("[Query] sql: [%s] data: [%s] err:[%s]", query, strings.Join(args, ","), err.Error())
    29  	}
    30  	defer rows.Close()
    31  	columns, err := rows.Columns()
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	lenColumn := len(columns)
    36  	for rows.Next() {
    37  		rowArray := make([]interface{}, lenColumn)
    38  		//box value with *RawByte
    39  		for k1 := range rowArray {
    40  			var s sql.RawBytes
    41  			rowArray[k1] = &s
    42  		}
    43  		if err := rows.Scan(rowArray...); err != nil {
    44  			return nil, err
    45  		}
    46  		rowMap := make(map[string]string)
    47  		for rowIndex, rowName := range columns {
    48  			//unbox value with *string
    49  			rowMap[rowName] = string(*(rowArray[rowIndex].(*sql.RawBytes)))
    50  		}
    51  		output = append(output, rowMap)
    52  	}
    53  	if err := rows.Err(); err != nil {
    54  		return nil, err
    55  	}
    56  	return
    57  }
    58  
    59  // 如果没有数据不会报错
    60  func MustQueryOne(query string, args ...string) map[string]string {
    61  	out, err := GetDb().QueryOne(query, args...)
    62  	if err != nil {
    63  		panic(err)
    64  	}
    65  	return out
    66  }
    67  
    68  func QueryOne(query string, args ...string) (output map[string]string, err error) {
    69  	return GetDb().QueryOne(query, args...)
    70  }
    71  
    72  func (q DbQueryer) QueryOne(query string, args ...string) (output map[string]string, err error) {
    73  	list, err := q.Query(query, args...)
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  	if len(list) == 0 {
    78  		return nil, nil
    79  	}
    80  	output = list[0]
    81  	return output, err
    82  }
    83  
    84  func MustExec(query string, args ...string) {
    85  	_, err := Exec(query, args...)
    86  	if err != nil {
    87  		panic(err)
    88  	}
    89  }
    90  
    91  func Exec(query string, args ...string) (sql.Result, error) {
    92  	return GetDb().Exec(query, args...)
    93  }
    94  
    95  func (q DbQueryer) Exec(query string, args ...string) (sql.Result, error) {
    96  	ret, err := q.SqlQueryer.Exec(query, argsStringToInterface(args...)...)
    97  	if err != nil {
    98  		return nil, fmt.Errorf("[Exec] sql: [%s] data: [%s] err:[%s]", query, strings.Join(args, ","), err.Error())
    99  	}
   100  	return ret, err
   101  }
   102  
   103  func MustInsert(tableName string, row map[string]string) (lastInsertId int) {
   104  	lastInsertId, err := GetDb().Insert(tableName, row)
   105  	if err != nil {
   106  		panic(err)
   107  	}
   108  	return lastInsertId
   109  }
   110  
   111  func Insert(tableName string, row map[string]string) (lastInsertId int, err error) {
   112  	return GetDb().Insert(tableName, row)
   113  }
   114  
   115  func (q DbQueryer) Insert(tableName string, row map[string]string) (lastInsertId int, err error) {
   116  	keyList := []string{}
   117  	valueList := []string{}
   118  	for key, value := range row {
   119  		keyList = append(keyList, key)
   120  		valueList = append(valueList, value)
   121  	}
   122  	keyStr := "`" + strings.Join(keyList, "`,`") + "`"
   123  	valueStr := strings.Repeat("?,", (len(row)-1)) + "?"
   124  	sql := fmt.Sprintf("INSERT INTO `%s` (%s) VALUES (%s)", tableName, keyStr, valueStr)
   125  	result, err := q.Exec(sql, valueList...)
   126  	if err != nil {
   127  		return 0, err
   128  	}
   129  	id, _ := result.LastInsertId()
   130  	lastInsertId = int(id)
   131  	return lastInsertId, err
   132  }
   133  
   134  func MustUpdateById(tableName string, primaryKeyName string, row map[string]string) {
   135  	err := GetDb().UpdateById(tableName, primaryKeyName, row)
   136  	if err != nil {
   137  		panic(err)
   138  	}
   139  }
   140  
   141  func UpdateById(tableName string, primaryKeyName string, row map[string]string) error {
   142  	return GetDb().UpdateById(tableName, primaryKeyName, row)
   143  }
   144  
   145  func (q DbQueryer) UpdateById(tableName string, primaryKeyName string, row map[string]string) error {
   146  	keyList := []string{}
   147  	valueList := []string{}
   148  	var idValue string
   149  	for key, value := range row {
   150  		if primaryKeyName == key {
   151  			idValue = value
   152  			continue
   153  		}
   154  		keyList = append(keyList, "`"+key+"`=?")
   155  		valueList = append(valueList, value)
   156  	}
   157  	if idValue == "" {
   158  		return fmt.Errorf("%s no set", primaryKeyName)
   159  	}
   160  	valueList = append(valueList, idValue)
   161  	updateStr := strings.Join(keyList, ",")
   162  	//sql例子 UPDATE AdminUser SET username=?,password=? where id = 1;
   163  	sql := fmt.Sprintf("UPDATE `%s` SET %s where `%s` = ?", tableName, updateStr, primaryKeyName)
   164  	_, err := q.Exec(sql, valueList...)
   165  	if err != nil {
   166  		return err
   167  	}
   168  	return nil
   169  }
   170  
   171  func MustReplaceById(tableName string, primaryKeyName string, row map[string]string) (lastInsertId int) {
   172  	lastInsertId, err := GetDb().ReplaceById(tableName, primaryKeyName, row)
   173  	if err != nil {
   174  		panic(err)
   175  	}
   176  	return lastInsertId
   177  }
   178  
   179  func ReplaceById(tableName string, primaryKeyName string, row map[string]string) (lastInsertId int, err error) {
   180  	return GetDb().ReplaceById(tableName, primaryKeyName, row)
   181  }
   182  
   183  func (q DbQueryer) ReplaceById(tableName string, primaryKeyName string, row map[string]string) (lastInsertId int, err error) {
   184  	var one map[string]string
   185  	if idValue, ok := row[primaryKeyName]; ok {
   186  		one, _ = q.GetOneWhere(tableName, primaryKeyName, idValue)
   187  	}
   188  	if one == nil {
   189  		return q.Insert(tableName, row)
   190  	}
   191  	err = q.UpdateById(tableName, primaryKeyName, row)
   192  	if err != nil {
   193  		return 0, err
   194  	}
   195  	lastInsertId, err = strconv.Atoi(one[primaryKeyName])
   196  	if err != nil {
   197  		lastInsertId = 0
   198  		err = nil
   199  	}
   200  	return lastInsertId, nil
   201  }
   202  
   203  func MustGetOneWhere(tableName string, fieldName string, value string) (output map[string]string) {
   204  	output, err := GetDb().GetOneWhere(tableName, fieldName, value)
   205  	if err != nil {
   206  		panic(err)
   207  	}
   208  	return output
   209  }
   210  
   211  // 如果没有数据不会报错,output和err都会返回nil
   212  func GetOneWhere(tableName string, fieldName string, value string) (output map[string]string, err error) {
   213  	return GetDb().GetOneWhere(tableName, fieldName, value)
   214  }
   215  
   216  func (q DbQueryer) GetOneWhere(tableName string, fieldName string, value string) (output map[string]string, err error) {
   217  	sql := fmt.Sprintf("SELECT * FROM `%s` WHERE `%s`=? LIMIT 1", tableName, fieldName)
   218  	return q.QueryOne(sql, value)
   219  }
   220  func MustDeleteById(tableName string, fieldName string, value string) {
   221  	err := GetDb().DeleteById(tableName, fieldName, value)
   222  	if err != nil {
   223  		panic(err)
   224  	}
   225  }
   226  
   227  func DeleteById(tableName string, fieldName string, value string) error {
   228  	return GetDb().DeleteById(tableName, fieldName, value)
   229  }
   230  
   231  func (q DbQueryer) DeleteById(tableName string, fieldName string, value string) error {
   232  	sql := fmt.Sprintf("DELETE FROM `%s` WHERE `%s`=?", tableName, fieldName)
   233  	_, err := q.Exec(sql, value)
   234  	return err
   235  }
   236  
   237  func MustGetAllInTable(tableName string) (output []map[string]string) {
   238  	output, err := GetDb().GetAllInTable(tableName)
   239  	if err != nil {
   240  		panic(err)
   241  	}
   242  	return output
   243  }
   244  
   245  func GetAllInTable(tableName string) (output []map[string]string, err error) {
   246  	return GetDb().GetAllInTable(tableName)
   247  }
   248  
   249  func (q DbQueryer) GetAllInTable(tableName string) (output []map[string]string, err error) {
   250  	return q.Query("SELECT * FROM `" + tableName + "`")
   251  }
   252  
   253  func MustRunSelectCommand(selectCommand *MysqlAst.SelectCommand) (mapValue []map[string]string) {
   254  	return GetDb().MustRunSelectCommand(selectCommand)
   255  }
   256  
   257  func (q DbQueryer) MustRunSelectCommand(selectCommand *MysqlAst.SelectCommand) (mapValue []map[string]string) {
   258  	output, paramList := selectCommand.GetPrepareParameter()
   259  	list, error := q.Query(output, paramList...)
   260  	if error != nil {
   261  		panic(error)
   262  	}
   263  	return list
   264  }
   265  
   266  //事务不可以ping,ping需要数据库存在
   267  func Ping() (err error) {
   268  	return GetDb().Ping()
   269  }
   270  
   271  //事务不可以ping,ping需要数据库存在
   272  func MustPing() {
   273  	err := Ping()
   274  	if err != nil {
   275  		panic(err)
   276  	}
   277  }
   278  func argsStringToInterface(args ...string) []interface{} {
   279  	_args := []interface{}{}
   280  	for _, value := range args {
   281  		_args = append(_args, value)
   282  	}
   283  	return _args
   284  }
   285  
   286  func GetFirstIntFromRowList(rowList []map[string]string) int {
   287  	if len(rowList) == 0 {
   288  		return 0
   289  	}
   290  	for _, val := range rowList[0] {
   291  		return kmgStrconv.AtoIDefault0(val)
   292  	}
   293  	return 0
   294  }