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 }