mirror of
https://github.com/gohouse/gorose.git
synced 2025-09-26 20:01:15 +08:00
must column
This commit is contained in:
38
database.go
38
database.go
@@ -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
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -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
|
||||
}
|
||||
|
13
readme.md
13
readme.md
@@ -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 查询结果绑定到对象
|
||||
|
@@ -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
|
||||
}
|
||||
|
19
toSql.go
19
toSql.go
@@ -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
7
util_test.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package gorose
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestGetRandomInt(t *testing.T) {
|
||||
t.Log(GetRandomInt(10))
|
||||
}
|
Reference in New Issue
Block a user