From 78536de1b5c8c711a75bb4c3916ae9777b731ddc Mon Sep 17 00:00:00 2001 From: chenghonour Date: Fri, 17 Jul 2020 11:28:47 +0800 Subject: [PATCH 1/5] add database method --- database/gdb/gdb.go | 1 + database/gdb/gdb_core.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/database/gdb/gdb.go b/database/gdb/gdb.go index 1814c19be..34b17c1df 100644 --- a/database/gdb/gdb.go +++ b/database/gdb/gdb.go @@ -142,6 +142,7 @@ type DB interface { QuotePrefixTableName(table string) string Tables(schema ...string) (tables []string, err error) TableFields(table string, schema ...string) (map[string]*TableField, error) + HasTable(name string) (bool, error) // HandleSqlBeforeCommit is a hook function, which deals with the sql string before // it's committed to underlying driver. The parameter specifies the current diff --git a/database/gdb/gdb_core.go b/database/gdb/gdb_core.go index 372a6f073..1a20bbbeb 100644 --- a/database/gdb/gdb_core.go +++ b/database/gdb/gdb_core.go @@ -778,3 +778,17 @@ func (c *Core) writeSqlToLogger(v *Sql) { c.logger.Debug(s) } } + +// HasTable determine whether the table name exists in the database. +func (c *Core) HasTable(name string) (bool, error) { + tableList, err := c.DB.Tables() + if err != nil { + return false, err + } + for _, table := range tableList { + if table == name { + return true, nil + } + } + return false, nil +} \ No newline at end of file From 534cd3be1c934ae07b4c59cf6c747d2ee9c50b14 Mon Sep 17 00:00:00 2001 From: chenghonour Date: Fri, 17 Jul 2020 14:28:50 +0800 Subject: [PATCH 2/5] add table field method --- database/gdb/gdb_model_fields.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/database/gdb/gdb_model_fields.go b/database/gdb/gdb_model_fields.go index 580b57fc7..b051afba6 100644 --- a/database/gdb/gdb_model_fields.go +++ b/database/gdb/gdb_model_fields.go @@ -127,3 +127,24 @@ func (m *Model) FieldsExStr(fields string, prefix ...string) string { newFields = m.db.QuoteString(newFields) return newFields } + +// HasField determine whether the field exists in the table. +func (m *Model) HasField(field string) bool { + tableFields, err := m.db.TableFields(m.tables) + if err != nil { + panic(err) + } + if len(tableFields) == 0 { + panic(fmt.Sprintf(`empty table fields for table "%s"`, m.tables)) + } + fieldsArray := make([]string, len(tableFields)) + for k, v := range tableFields { + fieldsArray[v.Index] = k + } + for _, f := range fieldsArray { + if f == field { + return true + } + } + return false +} \ No newline at end of file From 2f44d9ae1831b3bf8f0d882c6d5fc37406f5aa37 Mon Sep 17 00:00:00 2001 From: chenghonour Date: Tue, 21 Jul 2020 12:37:04 +0800 Subject: [PATCH 3/5] add unit test --- database/gdb/gdb_model_fields.go | 11 +++++---- database/gdb/gdb_z_mysql_model_test.go | 34 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/database/gdb/gdb_model_fields.go b/database/gdb/gdb_model_fields.go index b051afba6..3e9421bb2 100644 --- a/database/gdb/gdb_model_fields.go +++ b/database/gdb/gdb_model_fields.go @@ -7,6 +7,7 @@ package gdb import ( + "errors" "fmt" "github.com/gogf/gf/container/gset" "github.com/gogf/gf/text/gstr" @@ -129,13 +130,13 @@ func (m *Model) FieldsExStr(fields string, prefix ...string) string { } // HasField determine whether the field exists in the table. -func (m *Model) HasField(field string) bool { +func (m *Model) HasField(field string) (bool, error) { tableFields, err := m.db.TableFields(m.tables) if err != nil { - panic(err) + return false, err } if len(tableFields) == 0 { - panic(fmt.Sprintf(`empty table fields for table "%s"`, m.tables)) + return false, errors.New(fmt.Sprintf(`empty table fields for table "%s"`, m.tables)) } fieldsArray := make([]string, len(tableFields)) for k, v := range tableFields { @@ -143,8 +144,8 @@ func (m *Model) HasField(field string) bool { } for _, f := range fieldsArray { if f == field { - return true + return true, nil } } - return false + return false, nil } \ No newline at end of file diff --git a/database/gdb/gdb_z_mysql_model_test.go b/database/gdb/gdb_z_mysql_model_test.go index eabf8d607..faa04202e 100644 --- a/database/gdb/gdb_z_mysql_model_test.go +++ b/database/gdb/gdb_z_mysql_model_test.go @@ -2437,3 +2437,37 @@ func Test_Model_Empty_Slice_Argument(t *testing.T) { t.Assert(len(result), 0) }) } + +func Test_Model_HasTable(t *testing.T) { + table := createTable() + defer dropTable(table) + + gtest.C(t, func(t *gtest.T) { + result, err := db.HasTable(table) + t.Assert(result, true) + t.Assert(err, nil) + }) + + gtest.C(t, func(t *gtest.T) { + result, err := db.HasTable("table12321") + t.Assert(result, false) + t.Assert(err, nil) + }) +} + +func Test_Model_HasField(t *testing.T) { + table := createTable() + defer dropTable(table) + + gtest.C(t, func(t *gtest.T) { + result, err := db.Table(table).HasField("id") + t.Assert(result, true) + t.Assert(err, nil) + }) + + gtest.C(t, func(t *gtest.T) { + result, err := db.Table(table).HasField("id123") + t.Assert(result, false) + t.Assert(err, nil) + }) +} \ No newline at end of file From 1d5e717a80f517dfb8f46bc01ca798f7247199c8 Mon Sep 17 00:00:00 2001 From: chenghonour Date: Tue, 21 Jul 2020 12:40:13 +0800 Subject: [PATCH 4/5] update err return --- database/gdb/gdb_model_fields.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/database/gdb/gdb_model_fields.go b/database/gdb/gdb_model_fields.go index 3e9421bb2..f1f735883 100644 --- a/database/gdb/gdb_model_fields.go +++ b/database/gdb/gdb_model_fields.go @@ -7,7 +7,6 @@ package gdb import ( - "errors" "fmt" "github.com/gogf/gf/container/gset" "github.com/gogf/gf/text/gstr" @@ -136,7 +135,7 @@ func (m *Model) HasField(field string) (bool, error) { return false, err } if len(tableFields) == 0 { - return false, errors.New(fmt.Sprintf(`empty table fields for table "%s"`, m.tables)) + return false, fmt.Errorf(`empty table fields for table "%s"`, m.tables) } fieldsArray := make([]string, len(tableFields)) for k, v := range tableFields { From d56835fc0022a9a4ed8915fb6ea5416246b91d87 Mon Sep 17 00:00:00 2001 From: chenghonour Date: Tue, 21 Jul 2020 13:28:25 +0800 Subject: [PATCH 5/5] go fmt --- database/gdb/gdb_core.go | 2 +- database/gdb/gdb_model_fields.go | 2 +- database/gdb/gdb_z_mysql_model_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/database/gdb/gdb_core.go b/database/gdb/gdb_core.go index 1a20bbbeb..22fac5e8c 100644 --- a/database/gdb/gdb_core.go +++ b/database/gdb/gdb_core.go @@ -791,4 +791,4 @@ func (c *Core) HasTable(name string) (bool, error) { } } return false, nil -} \ No newline at end of file +} diff --git a/database/gdb/gdb_model_fields.go b/database/gdb/gdb_model_fields.go index f1f735883..2fdd98b85 100644 --- a/database/gdb/gdb_model_fields.go +++ b/database/gdb/gdb_model_fields.go @@ -147,4 +147,4 @@ func (m *Model) HasField(field string) (bool, error) { } } return false, nil -} \ No newline at end of file +} diff --git a/database/gdb/gdb_z_mysql_model_test.go b/database/gdb/gdb_z_mysql_model_test.go index faa04202e..ec7d440fc 100644 --- a/database/gdb/gdb_z_mysql_model_test.go +++ b/database/gdb/gdb_z_mysql_model_test.go @@ -2470,4 +2470,4 @@ func Test_Model_HasField(t *testing.T) { t.Assert(result, false) t.Assert(err, nil) }) -} \ No newline at end of file +}