From 1ab7f00b91be81d71ffa9f1a169445bb618bf08e Mon Sep 17 00:00:00 2001 From: John Date: Tue, 29 Oct 2019 19:45:21 +0800 Subject: [PATCH] add FieldsEx function for gdb.Model --- database/gdb/gdb_model.go | 36 +++++++++++++++++---- database/gdb/gdb_unit_z_mysql_model_test.go | 34 +++++++++++++++++++ 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/database/gdb/gdb_model.go b/database/gdb/gdb_model.go index 6ae7360cd..9e76e703f 100644 --- a/database/gdb/gdb_model.go +++ b/database/gdb/gdb_model.go @@ -30,6 +30,7 @@ type Model struct { tablesInit string // 初始化Model时的表名称(可以是多个) tables string // 数据库操作表 fields string // 操作字段 + fieldsEx string // 操作字段(排除) where string // 操作条件 whereArgs []interface{} // 操作条件参数 whereHolder []*whereHolder // 操作条件预处理 @@ -183,6 +184,26 @@ func (md *Model) Fields(fields string) *Model { return model } +// 链式操作,查询字段(排除) +func (md *Model) FieldsEx(fields string) *Model { + model := md.getModel() + model.fieldsEx = fields + fieldsExSet := gset.NewStrSetFrom(gstr.SplitAndTrim(fields, ",")) + if m, err := md.db.TableFields(md.tables); err == nil { + model.fields = "" + for k, _ := range m { + if fieldsExSet.Contains(k) { + continue + } + if len(model.fields) > 0 { + model.fields += "," + } + model.fields += k + } + } + return model +} + // 链式操作,选项设置 func (md *Model) Option(option int) *Model { model := md.getModel() @@ -393,17 +414,20 @@ func (md *Model) doFilterDataMapForInsertOrUpdate(data Map, allowOmitEmpty bool) m.FilterEmpty() data = m.Map() } - // Keep specified fields. + if len(md.fields) > 0 && md.fields != "*" { - set := gset.NewStrSet() - for _, v := range gstr.SplitAndTrimSpace(md.fields, ",") { - set.Add(v) - } - for k, _ := range data { + // Keep specified fields. + set := gset.NewStrSetFrom(gstr.SplitAndTrim(md.fields, ",")) + for k := range data { if !set.Contains(k) { delete(data, k) } } + } else if len(md.fieldsEx) > 0 { + // Filter specified fields. + for _, v := range gstr.SplitAndTrim(md.fieldsEx, ",") { + delete(data, v) + } } return data } diff --git a/database/gdb/gdb_unit_z_mysql_model_test.go b/database/gdb/gdb_unit_z_mysql_model_test.go index a9ebb2822..d2ac2bed5 100644 --- a/database/gdb/gdb_unit_z_mysql_model_test.go +++ b/database/gdb/gdb_unit_z_mysql_model_test.go @@ -1172,3 +1172,37 @@ func Test_Model_Option_Where(t *testing.T) { gtest.Assert(v.String(), "1") }) } + +func Test_Model_FieldsEx(t *testing.T) { + table := createInitTable() + defer dropTable(table) + // Select. + gtest.Case(t, func() { + r, err := db.Table(table).FieldsEx("create_time, id").Where("id in (?)", g.Slice{1, 2}).OrderBy("id asc").All() + gtest.Assert(err, nil) + gtest.Assert(len(r), 2) + gtest.Assert(len(r[0]), 3) + gtest.Assert(r[0]["id"], "") + gtest.Assert(r[0]["passport"], "user_1") + gtest.Assert(r[0]["password"], "pass_1") + gtest.Assert(r[0]["nickname"], "name_1") + gtest.Assert(r[0]["create_time"], "") + gtest.Assert(r[1]["id"], "") + gtest.Assert(r[1]["passport"], "user_2") + gtest.Assert(r[1]["password"], "pass_2") + gtest.Assert(r[1]["nickname"], "name_2") + gtest.Assert(r[1]["create_time"], "") + }) + // Filter. + gtest.Case(t, func() { + r, err := db.Table(table).FieldsEx("password").Data(g.Map{"nickname": "123", "password": "456"}).Where("id", 3).Update() + gtest.Assert(err, nil) + n, _ := r.RowsAffected() + gtest.Assert(n, 1) + + one, err := db.Table(table).Where("id", 3).One() + gtest.Assert(err, nil) + gtest.Assert(one["nickname"], "123") + gtest.AssertNE(one["password"], "456") + }) +}