Skip to content

Commit e4c4fb5

Browse files
authored
feat(database/gdb): add Exist support for checking records existance for certain condition (#3854)
1 parent 656668f commit e4c4fb5

8 files changed

+109
-0
lines changed

contrib/drivers/clickhouse/clickhouse_z_unit_model_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,19 @@ func Test_Model_Count(t *testing.T) {
258258
})
259259
}
260260

261+
func Test_Model_Exist(t *testing.T) {
262+
table := createInitTable()
263+
defer dropTable(table)
264+
gtest.C(t, func(t *gtest.T) {
265+
exist, err := db.Model(table).Exist()
266+
t.AssertNil(err)
267+
t.Assert(exist, TableSize > 0)
268+
exist, err = db.Model(table).Where("id", -1).Exist()
269+
t.AssertNil(err)
270+
t.Assert(exist, false)
271+
})
272+
}
273+
261274
func Test_Model_Where(t *testing.T) {
262275
table := createInitTable()
263276
defer dropTable(table)

contrib/drivers/mssql/mssql_z_unit_model_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,19 @@ func Test_Model_Count(t *testing.T) {
519519
t.AssertNil(err)
520520
t.Assert(count, int64(TableSize))
521521
})
522+
}
522523

524+
func Test_Model_Exist(t *testing.T) {
525+
table := createInitTable()
526+
defer dropTable(table)
527+
gtest.C(t, func(t *gtest.T) {
528+
exist, err := db.Model(table).Exist()
529+
t.AssertNil(err)
530+
t.Assert(exist, TableSize > 0)
531+
exist, err = db.Model(table).Where("id", -1).Exist()
532+
t.AssertNil(err)
533+
t.Assert(exist, false)
534+
})
523535
}
524536

525537
func Test_Model_Select(t *testing.T) {

contrib/drivers/mysql/mysql_z_unit_model_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,19 @@ func Test_Model_Count(t *testing.T) {
734734
})
735735
}
736736

737+
func Test_Model_Exist(t *testing.T) {
738+
table := createInitTable()
739+
defer dropTable(table)
740+
gtest.C(t, func(t *gtest.T) {
741+
exist, err := db.Model(table).Exist()
742+
t.AssertNil(err)
743+
t.Assert(exist, TableSize > 0)
744+
exist, err = db.Model(table).Where("id", -1).Exist()
745+
t.AssertNil(err)
746+
t.Assert(exist, false)
747+
})
748+
}
749+
737750
func Test_Model_Value_WithCache(t *testing.T) {
738751
table := createTable()
739752
defer dropTable(table)

contrib/drivers/oracle/oracle_z_unit_model_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,19 @@ func Test_Model_Count(t *testing.T) {
460460

461461
}
462462

463+
func Test_Model_Exist(t *testing.T) {
464+
table := createInitTable()
465+
defer dropTable(table)
466+
gtest.C(t, func(t *gtest.T) {
467+
exist, err := db.Model(table).Exist()
468+
t.AssertNil(err)
469+
t.Assert(exist, TableSize > 0)
470+
exist, err = db.Model(table).Where("id", -1).Exist()
471+
t.AssertNil(err)
472+
t.Assert(exist, false)
473+
})
474+
}
475+
463476
func Test_Model_Select(t *testing.T) {
464477
table := createInitTable()
465478
defer dropTable(table)

contrib/drivers/pgsql/pgsql_z_unit_model_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,19 @@ func Test_Model_Count(t *testing.T) {
226226
})
227227
}
228228

229+
func Test_Model_Exist(t *testing.T) {
230+
table := createInitTable()
231+
defer dropTable(table)
232+
gtest.C(t, func(t *gtest.T) {
233+
exist, err := db.Model(table).Exist()
234+
t.AssertNil(err)
235+
t.Assert(exist, TableSize > 0)
236+
exist, err = db.Model(table).Where("id", -1).Exist()
237+
t.AssertNil(err)
238+
t.Assert(exist, false)
239+
})
240+
}
241+
229242
func Test_Model_Where(t *testing.T) {
230243
table := createInitTable()
231244
defer dropTable(table)

contrib/drivers/sqlite/sqlite_z_unit_model_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,19 @@ func Test_Model_Count(t *testing.T) {
865865
})
866866
}
867867

868+
func Test_Model_Exist(t *testing.T) {
869+
table := createInitTable()
870+
defer dropTable(table)
871+
gtest.C(t, func(t *gtest.T) {
872+
exist, err := db.Model(table).Exist()
873+
t.AssertNil(err)
874+
t.Assert(exist, TableSize > 0)
875+
exist, err = db.Model(table).Where("id", -1).Exist()
876+
t.AssertNil(err)
877+
t.Assert(exist, false)
878+
})
879+
}
880+
868881
func Test_Model_Select(t *testing.T) {
869882
table := createInitTable()
870883
defer dropTable(table)

contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,19 @@ func Test_Model_Count(t *testing.T) {
824824
})
825825
}
826826

827+
func Test_Model_Exist(t *testing.T) {
828+
table := createInitTable()
829+
defer dropTable(table)
830+
gtest.C(t, func(t *gtest.T) {
831+
exist, err := db.Model(table).Exist()
832+
t.AssertNil(err)
833+
t.Assert(exist, TableSize > 0)
834+
exist, err = db.Model(table).Where("id", -1).Exist()
835+
t.AssertNil(err)
836+
t.Assert(exist, false)
837+
})
838+
}
839+
827840
func Test_Model_Select(t *testing.T) {
828841
table := createInitTable()
829842
defer dropTable(table)

database/gdb/gdb_model_select.go

+19
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,25 @@ func (m *Model) Count(where ...interface{}) (int, error) {
467467
return 0, nil
468468
}
469469

470+
// Exist does "SELECT 1 FROM ... LIMIT 1" statement for the model.
471+
// The optional parameter `where` is the same as the parameter of Model.Where function,
472+
// see Model.Where.
473+
func (m *Model) Exist(where ...interface{}) (bool, error) {
474+
if len(where) > 0 {
475+
return m.Where(where[0], where[1:]...).Exist()
476+
}
477+
one, err := m.Fields(Raw("1")).One()
478+
if err != nil {
479+
return false, err
480+
}
481+
for _, val := range one {
482+
if val.Bool() {
483+
return true, nil
484+
}
485+
}
486+
return false, nil
487+
}
488+
470489
// CountColumn does "SELECT COUNT(x) FROM ..." statement for the model.
471490
func (m *Model) CountColumn(column string) (int, error) {
472491
if len(column) == 0 {

0 commit comments

Comments
 (0)