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..22fac5e8c 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 +} diff --git a/database/gdb/gdb_model_fields.go b/database/gdb/gdb_model_fields.go index 580b57fc7..2fdd98b85 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, error) { + tableFields, err := m.db.TableFields(m.tables) + if err != nil { + return false, err + } + if len(tableFields) == 0 { + return false, fmt.Errorf(`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, nil + } + } + return false, nil +} diff --git a/database/gdb/gdb_z_mysql_model_test.go b/database/gdb/gdb_z_mysql_model_test.go index eabf8d607..ec7d440fc 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) + }) +}