From e4c4fb591e4f281c9406b7b01d0b24d703e1c9da Mon Sep 17 00:00:00 2001 From: CyJaySong <29367599+cyjaysong@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:29:03 +0800 Subject: [PATCH] feat(database/gdb): add Exist support for checking records existance for certain condition (#3854) --- .../clickhouse_z_unit_model_test.go | 13 +++++++++++++ .../drivers/mssql/mssql_z_unit_model_test.go | 12 ++++++++++++ .../drivers/mysql/mysql_z_unit_model_test.go | 13 +++++++++++++ .../oracle/oracle_z_unit_model_test.go | 13 +++++++++++++ .../drivers/pgsql/pgsql_z_unit_model_test.go | 13 +++++++++++++ .../sqlite/sqlite_z_unit_model_test.go | 13 +++++++++++++ .../sqlitecgo/sqlitecgo_z_unit_model_test.go | 13 +++++++++++++ database/gdb/gdb_model_select.go | 19 +++++++++++++++++++ 8 files changed, 109 insertions(+) diff --git a/contrib/drivers/clickhouse/clickhouse_z_unit_model_test.go b/contrib/drivers/clickhouse/clickhouse_z_unit_model_test.go index 1d6bbdab429..31600e67683 100644 --- a/contrib/drivers/clickhouse/clickhouse_z_unit_model_test.go +++ b/contrib/drivers/clickhouse/clickhouse_z_unit_model_test.go @@ -258,6 +258,19 @@ func Test_Model_Count(t *testing.T) { }) } +func Test_Model_Exist(t *testing.T) { + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) +} + func Test_Model_Where(t *testing.T) { table := createInitTable() defer dropTable(table) diff --git a/contrib/drivers/mssql/mssql_z_unit_model_test.go b/contrib/drivers/mssql/mssql_z_unit_model_test.go index a31ff478d64..7435e84cc24 100644 --- a/contrib/drivers/mssql/mssql_z_unit_model_test.go +++ b/contrib/drivers/mssql/mssql_z_unit_model_test.go @@ -519,7 +519,19 @@ func Test_Model_Count(t *testing.T) { t.AssertNil(err) t.Assert(count, int64(TableSize)) }) +} +func Test_Model_Exist(t *testing.T) { + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) } func Test_Model_Select(t *testing.T) { diff --git a/contrib/drivers/mysql/mysql_z_unit_model_test.go b/contrib/drivers/mysql/mysql_z_unit_model_test.go index 652f69dadac..6cc4237be27 100644 --- a/contrib/drivers/mysql/mysql_z_unit_model_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_model_test.go @@ -734,6 +734,19 @@ func Test_Model_Count(t *testing.T) { }) } +func Test_Model_Exist(t *testing.T) { + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) +} + func Test_Model_Value_WithCache(t *testing.T) { table := createTable() defer dropTable(table) diff --git a/contrib/drivers/oracle/oracle_z_unit_model_test.go b/contrib/drivers/oracle/oracle_z_unit_model_test.go index e7e7cf6ef0e..b9ecb5b4cac 100644 --- a/contrib/drivers/oracle/oracle_z_unit_model_test.go +++ b/contrib/drivers/oracle/oracle_z_unit_model_test.go @@ -460,6 +460,19 @@ func Test_Model_Count(t *testing.T) { } +func Test_Model_Exist(t *testing.T) { + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) +} + func Test_Model_Select(t *testing.T) { table := createInitTable() defer dropTable(table) diff --git a/contrib/drivers/pgsql/pgsql_z_unit_model_test.go b/contrib/drivers/pgsql/pgsql_z_unit_model_test.go index 52571d60ddb..634de6dc821 100644 --- a/contrib/drivers/pgsql/pgsql_z_unit_model_test.go +++ b/contrib/drivers/pgsql/pgsql_z_unit_model_test.go @@ -226,6 +226,19 @@ func Test_Model_Count(t *testing.T) { }) } +func Test_Model_Exist(t *testing.T) { + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) +} + func Test_Model_Where(t *testing.T) { table := createInitTable() defer dropTable(table) diff --git a/contrib/drivers/sqlite/sqlite_z_unit_model_test.go b/contrib/drivers/sqlite/sqlite_z_unit_model_test.go index c9e78d7982d..99fde77228a 100644 --- a/contrib/drivers/sqlite/sqlite_z_unit_model_test.go +++ b/contrib/drivers/sqlite/sqlite_z_unit_model_test.go @@ -865,6 +865,19 @@ func Test_Model_Count(t *testing.T) { }) } +func Test_Model_Exist(t *testing.T) { + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) +} + func Test_Model_Select(t *testing.T) { table := createInitTable() defer dropTable(table) diff --git a/contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go b/contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go index 05e146d769f..b028294d909 100644 --- a/contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go +++ b/contrib/drivers/sqlitecgo/sqlitecgo_z_unit_model_test.go @@ -824,6 +824,19 @@ func Test_Model_Count(t *testing.T) { }) } +func Test_Model_Exist(t *testing.T) { + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) +} + func Test_Model_Select(t *testing.T) { table := createInitTable() defer dropTable(table) diff --git a/database/gdb/gdb_model_select.go b/database/gdb/gdb_model_select.go index 018b37b0a0f..98f91bd127f 100644 --- a/database/gdb/gdb_model_select.go +++ b/database/gdb/gdb_model_select.go @@ -467,6 +467,25 @@ func (m *Model) Count(where ...interface{}) (int, error) { return 0, nil } +// Exist does "SELECT 1 FROM ... LIMIT 1" statement for the model. +// The optional parameter `where` is the same as the parameter of Model.Where function, +// see Model.Where. +func (m *Model) Exist(where ...interface{}) (bool, error) { + if len(where) > 0 { + return m.Where(where[0], where[1:]...).Exist() + } + one, err := m.Fields(Raw("1")).One() + if err != nil { + return false, err + } + for _, val := range one { + if val.Bool() { + return true, nil + } + } + return false, nil +} + // CountColumn does "SELECT COUNT(x) FROM ..." statement for the model. func (m *Model) CountColumn(column string) (int, error) { if len(column) == 0 {