allow inserting maps as well as structs
This commit is contained in:
parent
44c823a1ae
commit
8d62c3b589
35
db.go
35
db.go
@ -324,7 +324,7 @@ func (db *DB) Update(tableName string, fields map[string]any, whereField string,
|
||||
})
|
||||
}
|
||||
|
||||
// Insert inserts a struct into the database
|
||||
// Insert inserts a struct or map into the database
|
||||
func (db *DB) Insert(tableName string, obj any, excludeFields ...string) (int64, error) {
|
||||
conn, err := db.pool.Take(context.Background())
|
||||
if err != nil {
|
||||
@ -332,12 +332,6 @@ func (db *DB) Insert(tableName string, obj any, excludeFields ...string) (int64,
|
||||
}
|
||||
defer db.pool.Put(conn)
|
||||
|
||||
v := reflect.ValueOf(obj)
|
||||
if v.Kind() == reflect.Pointer {
|
||||
v = v.Elem()
|
||||
}
|
||||
t := v.Type()
|
||||
|
||||
exclude := make(map[string]bool)
|
||||
for _, field := range excludeFields {
|
||||
exclude[toSnakeCase(field)] = true
|
||||
@ -347,18 +341,43 @@ func (db *DB) Insert(tableName string, obj any, excludeFields ...string) (int64,
|
||||
var placeholders []string
|
||||
var args []any
|
||||
|
||||
v := reflect.ValueOf(obj)
|
||||
if v.Kind() == reflect.Pointer {
|
||||
v = v.Elem()
|
||||
}
|
||||
|
||||
switch v.Kind() {
|
||||
case reflect.Map:
|
||||
// Handle map[string]any
|
||||
m := obj.(map[string]any)
|
||||
for key, value := range m {
|
||||
columnName := toSnakeCase(key)
|
||||
if exclude[columnName] {
|
||||
continue
|
||||
}
|
||||
columns = append(columns, columnName)
|
||||
placeholders = append(placeholders, "?")
|
||||
args = append(args, value)
|
||||
}
|
||||
|
||||
case reflect.Struct:
|
||||
// Handle struct
|
||||
t := v.Type()
|
||||
for i := 0; i < t.NumField(); i++ {
|
||||
field := t.Field(i)
|
||||
columnName := toSnakeCase(field.Name)
|
||||
if exclude[columnName] {
|
||||
continue
|
||||
}
|
||||
|
||||
columns = append(columns, columnName)
|
||||
placeholders = append(placeholders, "?")
|
||||
args = append(args, v.Field(i).Interface())
|
||||
}
|
||||
|
||||
default:
|
||||
return 0, fmt.Errorf("obj must be a struct, pointer to struct, or map[string]any")
|
||||
}
|
||||
|
||||
query := fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s)",
|
||||
tableName, strings.Join(columns, ", "), strings.Join(placeholders, ", "))
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user