From 17385eeaeff8f2c29dd38e4aba5134cb9867a37a Mon Sep 17 00:00:00 2001 From: wln32 <49137144+wln32@users.noreply.github.com> Date: Wed, 22 May 2024 21:26:53 +0800 Subject: [PATCH] database/gdb: fix confusing error message in Insert/Update operations when table not exist or the table contains no fields (#3553) --- contrib/drivers/pgsql/pgsql_z_unit_db_test.go | 56 +++++++++++++++++++ database/gdb/gdb_core_structure.go | 6 ++ 2 files changed, 62 insertions(+) diff --git a/contrib/drivers/pgsql/pgsql_z_unit_db_test.go b/contrib/drivers/pgsql/pgsql_z_unit_db_test.go index 1943dc7bf..9cadd86d1 100644 --- a/contrib/drivers/pgsql/pgsql_z_unit_db_test.go +++ b/contrib/drivers/pgsql/pgsql_z_unit_db_test.go @@ -8,6 +8,7 @@ package pgsql_test import ( "fmt" + "strings" "testing" "github.com/gogf/gf/v2/frame/g" @@ -327,3 +328,58 @@ func Test_DB_TableFields(t *testing.T) { } }) } + +func Test_NoFields_Error(t *testing.T) { + createSql := `CREATE TABLE IF NOT EXISTS %s ( +id bigint PRIMARY KEY, +int_col INT);` + + type Data struct { + Id int64 + IntCol int64 + } + // pgsql converts table names to lowercase + tableName := "Error_table" + errStr := fmt.Sprintf(`The table "%s" may not exist, or the table contains no fields`, tableName) + _, err := db.Exec(ctx, fmt.Sprintf(createSql, tableName)) + gtest.AssertNil(err) + defer dropTable(tableName) + + gtest.C(t, func(t *gtest.T) { + var data = Data{ + Id: 2, + IntCol: 2, + } + _, err = db.Model(tableName).Data(data).Insert() + t.Assert(err, errStr) + + // Insert a piece of test data using lowercase + _, err = db.Model(strings.ToLower(tableName)).Data(data).Insert() + t.AssertNil(err) + + _, err = db.Model(tableName).Where("id", 1).Data(g.Map{ + "int_col": 9999, + }).Update() + t.Assert(err, errStr) + + }) + // The inserted field does not exist in the table + gtest.C(t, func(t *gtest.T) { + data := map[string]any{ + "id1": 22, + "int_col_22": 11111, + } + _, err = db.Model(tableName).Data(data).Insert() + t.Assert(err, errStr) + + lowerTableName := strings.ToLower(tableName) + _, err = db.Model(lowerTableName).Data(data).Insert() + t.Assert(err, fmt.Errorf(`input data match no fields in table "%s"`, lowerTableName)) + + _, err = db.Model(lowerTableName).Where("id", 1).Data(g.Map{ + "int_col-2": 9999, + }).Update() + t.Assert(err, fmt.Errorf(`input data match no fields in table "%s"`, lowerTableName)) + }) + +} diff --git a/database/gdb/gdb_core_structure.go b/database/gdb/gdb_core_structure.go index 81d6971b1..452de2345 100644 --- a/database/gdb/gdb_core_structure.go +++ b/database/gdb/gdb_core_structure.go @@ -381,6 +381,9 @@ func (c *Core) mappingAndFilterData(ctx context.Context, schema, table string, d if err != nil { return nil, err } + if len(fieldsMap) == 0 { + return nil, gerror.Newf(`The table %s may not exist, or the table contains no fields`, table) + } fieldsKeyMap := make(map[string]interface{}, len(fieldsMap)) for k := range fieldsMap { fieldsKeyMap[k] = nil @@ -406,6 +409,9 @@ func (c *Core) mappingAndFilterData(ctx context.Context, schema, table string, d delete(data, dataKey) } } + if len(data) == 0 { + return nil, gerror.Newf(`input data match no fields in table %s`, table) + } } return data, nil }