11package goqux
22
33import (
4+ "fmt"
45 "reflect"
56 "strings"
67 "time"
@@ -26,7 +27,9 @@ const (
2627 // Same as default now but will inject time.Now().UTC()
2728 defaultNowUtc = "now_utc"
2829 // omitempty will skip the field if it is zero value
29- omitEmpty = ",omitempty"
30+ omitEmpty = "omitempty"
31+ // omitnil will skip the field if it is nil
32+ omitNil = "omitnil"
3033)
3134
3235func convertMapToSQLValuer (m map [string ]any ) map [string ]SQLValuer {
@@ -58,10 +61,16 @@ func encodeValues(v any, skipType string, skipZeroValues bool) map[string]SQLVal
5861 columnName := strcase .ToSnake (f .Name )
5962 if dbTag := f .Tag .Get (tagNameDb ); dbTag != "" {
6063 if strings .Contains (dbTag , omitEmpty ) {
61- if value .IsZero () {
64+ if ! value .IsValid () || value . IsZero () { // IsZero panic on valid values
6265 continue
6366 }
64- dbTag = cleanDbTag (dbTag )
67+ dbTag = cleanDbTag (dbTag , omitEmpty )
68+ }
69+ if strings .Contains (dbTag , omitNil ) {
70+ if value .IsNil () {
71+ continue
72+ }
73+ dbTag = cleanDbTag (dbTag , omitNil )
6574 }
6675 columnName = dbTag
6776 }
@@ -91,7 +100,7 @@ func getColumnsFromStruct(table exp.IdentifierExpression, s any, skipType string
91100 }
92101 var colName string
93102 if dbTag := f .Tag .Get (tagNameDb ); dbTag != "" {
94- colName = cleanDbTag (dbTag )
103+ colName = cleanDbTag (dbTag , omitEmpty , omitNil )
95104 } else {
96105 colName = strcase .ToSnake (f .Name )
97106 }
@@ -100,11 +109,32 @@ func getColumnsFromStruct(table exp.IdentifierExpression, s any, skipType string
100109 return cols
101110}
102111
103- func cleanDbTag (tag string ) string {
104- if strings .Contains (tag , omitEmpty ) {
105- tag = strings .ReplaceAll (tag , omitEmpty , "" )
112+ func cleanDbTag (tag string , tagsToClean ... string ) string {
113+ for _ , tagToClean := range tagsToClean {
114+ // Handle case where tag is just the partToClean
115+ if tag == tagToClean {
116+ return ""
117+ }
118+
119+ // Handle case where tag starts with partToClean
120+ if strings .HasPrefix (tag , fmt .Sprintf ("%s," , tagToClean )) {
121+ tag = strings .TrimPrefix (tag , fmt .Sprintf ("%s," , tagToClean ))
122+ }
123+
124+ // Handle case where tag ends with partToClean
125+ if strings .HasSuffix (tag , fmt .Sprintf (",%s" , tagToClean )) {
126+ tag = strings .TrimSuffix (tag , fmt .Sprintf (",%s" , tagToClean ))
127+ }
128+
129+ // Handle case where tagToClean tag is in the middle
130+ if strings .Contains (tag , fmt .Sprintf (",%s," , tagToClean )) {
131+ tag = strings .ReplaceAll (tag , fmt .Sprintf (",%s," , tagToClean ), "," )
132+ }
106133 }
107134
135+ // Clean up any remaining commas
136+ tag = strings .Trim (tag , "," )
137+
108138 return tag
109139}
110140
0 commit comments