must column

This commit is contained in:
飞哥(fizzday)
2024-03-21 09:16:48 +08:00
parent fb0ccff263
commit d3997394b8
7 changed files with 67 additions and 50 deletions

View File

@@ -16,7 +16,7 @@ type IBuilder interface {
ToSqlLimitOffset() (sqlSegment string, binds []any)
ToSqlInsert(obj any, args ...TypeToSqlInsertCase) (sqlSegment string, binds []any, err error)
ToSqlDelete(obj any) (sqlSegment string, binds []any, err error)
ToSqlUpdate(obj any, mustFields ...string) (sqlSegment string, binds []any, err error)
ToSqlUpdate(obj any, mustColumn ...string) (sqlSegment string, binds []any, err error)
ToSqlIncDec(symbol string, data map[string]any) (sql4prepare string, values []any, err error)
}
@@ -216,45 +216,45 @@ func (db *Database) queryToBindResult(bind any, query string, args ...any) (err
return db.Engin.QueryTo(bind, query, args...)
}
// func (db *Database) insert(obj any, ignoreCase string, onDuplicateKeys []string, mustFields ...string) (res sql.Result, err error) {
// func (db *Database) insert(obj any, ignoreCase string, onDuplicateKeys []string, mustColumn ...string) (res sql.Result, err error) {
func (db *Database) insert(obj any, arg TypeToSqlInsertCase) (res sql.Result, err error) {
//segment, binds, err := db.ToSqlInsert(obj, ignoreCase, onDuplicateKeys, mustFields...)
//segment, binds, err := db.ToSqlInsert(obj, ignoreCase, onDuplicateKeys, mustColumn...)
segment, binds, err := db.ToSqlInsert(obj, arg)
if err != nil {
return res, err
}
return db.Engin.Exec(segment, binds...)
}
func (db *Database) InsertGetId(obj any, mustFields ...string) (lastInsertId int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{MustFields: mustFields})
func (db *Database) InsertGetId(obj any, mustColumn ...string) (lastInsertId int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{MustColumn: mustColumn})
if err != nil {
return lastInsertId, err
}
return result.LastInsertId()
}
func (db *Database) Insert(obj any, mustFields ...string) (aff int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{MustFields: mustFields})
func (db *Database) Insert(obj any, mustColumn ...string) (aff int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{MustColumn: mustColumn})
if err != nil {
return aff, err
}
return result.RowsAffected()
}
func (db *Database) InsertOrIgnore(obj any, mustFields ...string) (aff int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{IgnoreCase: "IGNORE", MustFields: mustFields})
func (db *Database) InsertOrIgnore(obj any, mustColumn ...string) (aff int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{IgnoreCase: "IGNORE", MustColumn: mustColumn})
if err != nil {
return aff, err
}
return result.RowsAffected()
}
func (db *Database) Upsert(obj any, onDuplicateKeys []string, mustFields ...string) (aff int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{OnDuplicateKeys: onDuplicateKeys, MustFields: mustFields})
func (db *Database) Upsert(obj any, onDuplicateKeys []string, mustColumn ...string) (aff int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{OnDuplicateKeys: onDuplicateKeys, MustColumn: mustColumn})
if err != nil {
return aff, err
}
return result.RowsAffected()
}
func (db *Database) Replace(obj any, mustFields ...string) (aff int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{IsReplace: true, MustFields: mustFields})
func (db *Database) Replace(obj any, mustColumn ...string) (aff int64, err error) {
result, err := db.insert(obj, TypeToSqlInsertCase{IsReplace: true, MustColumn: mustColumn})
if err != nil {
return aff, err
}
@@ -271,15 +271,15 @@ func (db *Database) UpdateOrInsert(attributes, values map[string]any) (affectedR
}
return dbTmp.Insert(values)
}
func (db *Database) Update(obj any, mustFields ...string) (aff int64, err error) {
segment, binds, err := db.ToSqlUpdate(obj, mustFields...)
func (db *Database) Update(obj any, mustColumn ...string) (aff int64, err error) {
segment, binds, err := db.ToSqlUpdate(obj, mustColumn...)
if err != nil {
return aff, err
}
return db.Engin.execute(segment, binds...)
}
func (db *Database) Delete(obj any, mustFields ...string) (aff int64, err error) {
segment, binds, err := db.ToSqlDelete(obj, mustFields...)
func (db *Database) Delete(obj any, mustColumn ...string) (aff int64, err error) {
segment, binds, err := db.ToSqlDelete(obj, mustColumn...)
if err != nil {
return aff, err
}
@@ -440,10 +440,10 @@ func (db *Database) Transaction(closure ...func(TxHandler) error) (err error) {
}
// To 通用查询,go 绑定 struct/map
func (db *Database) To(obj any, mustFields ...string) (err error) {
func (db *Database) To(obj any, mustColumn ...string) (err error) {
var prepare string
var binds []any
prepare, binds, err = db.ToSqlTo(obj, mustFields...)
prepare, binds, err = db.ToSqlTo(obj, mustColumn...)
if err != nil {
return
}

View File

@@ -21,7 +21,7 @@ type IDriver interface {
ToSql(c *Context) (sql4prepare string, binds []any, err error)
ToSqlInsert(c *Context, obj any, args ...TypeToSqlInsertCase) (sqlSegment string, binds []any, err error)
ToSqlUpdate(c *Context, arg any) (sqlSegment string, binds []any, err error)
ToSqlDelete(c *Context, obj any, mustFields ...string) (sqlSegment string, binds []any, err error)
ToSqlDelete(c *Context, obj any, mustColumn ...string) (sqlSegment string, binds []any, err error)
}
type Driver struct {

View File

@@ -269,7 +269,7 @@ func (b Builder) ToSqlLimitOffset(c *gorose.Context) (sqlSegment string, binds [
return
}
//func (b Builder) ToSqlInsert(c *gorose.Context, obj any, ignoreCase string, onDuplicateKeys []string, mustFields ...string) (sqlSegment string, binds []any, err error) {
//func (b Builder) ToSqlInsert(c *gorose.Context, obj any, ignoreCase string, onDuplicateKeys []string, mustColumn ...string) (sqlSegment string, binds []any, err error) {
// ToSqlInsert insert
func (b Builder) ToSqlInsert(c *gorose.Context, obj any, args ...gorose.TypeToSqlInsertCase) (sqlSegment string, binds []any, err error) {
@@ -282,7 +282,7 @@ func (b Builder) ToSqlInsert(c *gorose.Context, obj any, args ...gorose.TypeToSq
switch rfv.Kind() {
case reflect.Struct:
var datas []map[string]any
datas, err = gorose.StructsToInsert(obj, arg.MustFields...)
datas, err = gorose.StructsToInsert(obj, arg.MustColumn...)
if err != nil {
return
}
@@ -293,7 +293,7 @@ func (b Builder) ToSqlInsert(c *gorose.Context, obj any, args ...gorose.TypeToSq
case reflect.Struct:
c.TableClause.Table(obj)
var datas []map[string]any
datas, err = gorose.StructsToInsert(obj, arg.MustFields...)
datas, err = gorose.StructsToInsert(obj, arg.MustColumn...)
if err != nil {
return
}
@@ -306,12 +306,12 @@ func (b Builder) ToSqlInsert(c *gorose.Context, obj any, args ...gorose.TypeToSq
}
}
func (b Builder) ToSqlDelete(c *gorose.Context, obj any, mustFields ...string) (sqlSegment string, binds []any, err error) {
func (b Builder) ToSqlDelete(c *gorose.Context, obj any, mustColumn ...string) (sqlSegment string, binds []any, err error) {
var ctx = *c
rfv := reflect.Indirect(reflect.ValueOf(obj))
switch rfv.Kind() {
case reflect.Struct:
data, err := gorose.StructToDelete(obj, mustFields...)
data, err := gorose.StructToDelete(obj, mustColumn...)
if err != nil {
return sqlSegment, binds, err
}
@@ -330,7 +330,7 @@ func (b Builder) ToSqlDelete(c *gorose.Context, obj any, mustFields ...string) (
func (b Builder) ToSqlUpdate(c *gorose.Context, arg any) (sqlSegment string, binds []any, err error) {
switch v := arg.(type) {
case gorose.TypeToSqlUpdateCase:
return b.toSqlUpdate(c, v.BindOrData, v.MustFields...)
return b.toSqlUpdate(c, v.BindOrData, v.MustColumn...)
case gorose.TypeToSqlIncDecCase:
return b.toSqlIncDec(c, v.Symbol, v.Data)
default:
@@ -338,11 +338,11 @@ func (b Builder) ToSqlUpdate(c *gorose.Context, arg any) (sqlSegment string, bin
}
}
func (b Builder) toSqlUpdate(c *gorose.Context, obj any, mustFields ...string) (sqlSegment string, binds []any, err error) {
func (b Builder) toSqlUpdate(c *gorose.Context, obj any, mustColumn ...string) (sqlSegment string, binds []any, err error) {
rfv := reflect.Indirect(reflect.ValueOf(obj))
switch rfv.Kind() {
case reflect.Struct:
dataMap, pk, pkValue, err := gorose.StructToUpdate(obj, mustFields...)
dataMap, pk, pkValue, err := gorose.StructToUpdate(obj, mustColumn...)
if err != nil {
return sqlSegment, binds, err
}

View File

@@ -342,11 +342,20 @@ db().Table("users").List("id")
```go
// 查询一条数据
var user User
db().To(&user)
// 查询条件,一条数据
// select id,name,email from users where id=1
var user = User{Id: 1}
db().To(&user)
// 查询多条数据
var users []User
db().To(&user)
db().To(&users)
// 查询条件,多条数据
var users []User
db().Where("id", ">", 1).To(&users)
```
## Bind 查询结果绑定到对象

View File

@@ -89,11 +89,11 @@ func structsTypeParse(rft reflect.Type) (fieldTag []string, fieldStruct []string
// }
//}
func structDataToMap(rfv reflect.Value, tags, fieldStruct []string, mustFields ...string) (data map[string]any, err error) {
func structDataToMap(rfv reflect.Value, tags, fieldStruct []string, mustColumn ...string) (data map[string]any, err error) {
data = make(map[string]any)
for i, fieldName := range fieldStruct {
field := rfv.FieldByName(fieldName)
if (field.Kind() == reflect.Ptr && field.IsNil()) || (field.IsZero() && !slices.Contains(mustFields, tags[i])) {
if (field.Kind() == reflect.Ptr && field.IsNil()) || (field.IsZero() && !slices.Contains(mustColumn, tags[i])) {
continue
}
var rfvVal = field.Interface()
@@ -111,11 +111,11 @@ func structDataToMap(rfv reflect.Value, tags, fieldStruct []string, mustFields .
return
}
func structUpdateDataToMap(rfv reflect.Value, tags, fieldStruct []string, pkField string, mustFields ...string) (data map[string]any, err error) {
func structUpdateDataToMap(rfv reflect.Value, tags, fieldStruct []string, pkField string, mustColumn ...string) (data map[string]any, err error) {
data = make(map[string]any)
for i, fieldName := range fieldStruct {
field := rfv.FieldByName(fieldName)
if (field.Kind() == reflect.Ptr && field.IsNil()) || (field.IsZero() && !slices.Contains(mustFields, tags[i])) || fieldName == pkField {
if (field.Kind() == reflect.Ptr && field.IsNil()) || (field.IsZero() && !slices.Contains(mustColumn, tags[i])) || fieldName == pkField {
continue
}
var rfvVal = field.Interface()
@@ -133,22 +133,22 @@ func structUpdateDataToMap(rfv reflect.Value, tags, fieldStruct []string, pkFiel
return
}
func StructToDelete(obj any, mustFields ...string) (data map[string]any, err error) {
func StructToDelete(obj any, mustColumn ...string) (data map[string]any, err error) {
rfv := reflect.Indirect(reflect.ValueOf(obj))
if rfv.Kind() == reflect.Struct {
tag, fieldStruct, _ := structsTypeParse(rfv.Type())
data, err = structDataToMap(rfv, tag, fieldStruct, mustFields...)
data, err = structDataToMap(rfv, tag, fieldStruct, mustColumn...)
}
return
}
func StructsToInsert(obj any, mustFields ...string) (datas []map[string]any, err error) {
func StructsToInsert(obj any, mustColumn ...string) (datas []map[string]any, err error) {
rfv := reflect.Indirect(reflect.ValueOf(obj))
switch rfv.Kind() {
case reflect.Struct:
fieldTag, fieldStruct, _ := structsTypeParse(rfv.Type())
var data = make(map[string]any)
data, err = structDataToMap(rfv, fieldTag, fieldStruct, mustFields...)
data, err = structDataToMap(rfv, fieldTag, fieldStruct, mustColumn...)
if err != nil {
return
}
@@ -157,7 +157,7 @@ func StructsToInsert(obj any, mustFields ...string) (datas []map[string]any, err
tag, fieldStruct, _ := structsTypeParse(rfv.Type())
for i := 0; i < rfv.Len(); i++ {
var data = make(map[string]any)
data, err = structDataToMap(rfv.Index(i), tag, fieldStruct, mustFields...)
data, err = structDataToMap(rfv.Index(i), tag, fieldStruct, mustColumn...)
if err != nil {
return
}
@@ -169,12 +169,12 @@ func StructsToInsert(obj any, mustFields ...string) (datas []map[string]any, err
return
}
func StructToUpdate(obj any, mustFields ...string) (data map[string]any, pkTag string, pkValue any, err error) {
func StructToUpdate(obj any, mustColumn ...string) (data map[string]any, pkTag string, pkValue any, err error) {
tag, fieldStruct, pkField := StructsParse(obj)
if len(tag) > 0 {
data = make(map[string]any)
rfv := reflect.Indirect(reflect.ValueOf(obj))
data, err = structUpdateDataToMap(rfv, tag, fieldStruct, pkField, mustFields...)
data, err = structUpdateDataToMap(rfv, tag, fieldStruct, pkField, mustColumn...)
if err != nil {
return
}

View File

@@ -18,11 +18,12 @@ import (
type TypeToSqlUpdateCase struct {
BindOrData any
MustFields []string
MustColumn []string
}
//type TypeToSqlDeleteCase struct {
// Bind any
// MustFields []string
// MustColumn []string
//}
type TypeToSqlIncDecCase struct {
@@ -33,7 +34,7 @@ type TypeToSqlInsertCase struct {
IsReplace bool
IgnoreCase string
OnDuplicateKeys []string
MustFields []string
MustColumn []string
}
func (db *Database) ToSqlSelect() (sql4prepare string, binds []any) {
@@ -86,13 +87,13 @@ func (db *Database) ToSqlAggregate(function, column string) (sql4prepare string,
return db.Driver.ToSql(&ctx)
}
func (db *Database) ToSqlTo(obj any, mustFields ...string) (sql4prepare string, binds []any, err error) {
func (db *Database) ToSqlTo(obj any, mustColumn ...string) (sql4prepare string, binds []any, err error) {
rfv := reflect.Indirect(reflect.ValueOf(obj))
columns, fieldStruct, _ := StructsParse(obj)
switch rfv.Kind() {
case reflect.Struct:
var data = make(map[string]any)
data, err = structDataToMap(rfv, columns, fieldStruct, mustFields...)
data, err = structDataToMap(rfv, columns, fieldStruct, mustColumn...)
if err != nil {
return
}
@@ -110,12 +111,12 @@ func (db *Database) ToSqlTo(obj any, mustFields ...string) (sql4prepare string,
func (db *Database) ToSqlInsert(obj any, args ...TypeToSqlInsertCase) (sqlSegment string, binds []any, err error) {
return db.Driver.ToSqlInsert(db.Context, obj, args...)
}
func (db *Database) ToSqlDelete(obj any, mustFields ...string) (sqlSegment string, binds []any, err error) {
return db.Driver.ToSqlDelete(db.Context, obj, mustFields...)
func (db *Database) ToSqlDelete(obj any, mustColumn ...string) (sqlSegment string, binds []any, err error) {
return db.Driver.ToSqlDelete(db.Context, obj, mustColumn...)
}
func (db *Database) ToSqlUpdate(obj any, mustFields ...string) (sqlSegment string, binds []any, err error) {
return db.Driver.ToSqlUpdate(db.Context, TypeToSqlUpdateCase{obj, mustFields})
func (db *Database) ToSqlUpdate(obj any, mustColumn ...string) (sqlSegment string, binds []any, err error) {
return db.Driver.ToSqlUpdate(db.Context, TypeToSqlUpdateCase{obj, mustColumn})
}
func (db *Database) ToSqlIncDec(symbol string, data map[string]any) (sql4prepare string, values []any, err error) {
//return db.Driver.ToSqlIncDec(db.Context, symbol, data)

7
util_test.go Normal file
View File

@@ -0,0 +1,7 @@
package gorose
import "testing"
func TestGetRandomInt(t *testing.T) {
t.Log(GetRandomInt(10))
}