Merge pull request #800 from chenghonour/master

Add database method
This commit is contained in:
John Guo
2020-07-23 21:30:24 +08:00
committed by GitHub
4 changed files with 70 additions and 0 deletions

View File

@ -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 <link> specifies the current

View File

@ -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
}

View File

@ -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
}

View File

@ -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)
})
}