diff --git a/contrib/drivers/oracle/oracle_order.go b/contrib/drivers/oracle/oracle_order.go new file mode 100644 index 000000000..60d7157c4 --- /dev/null +++ b/contrib/drivers/oracle/oracle_order.go @@ -0,0 +1,12 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package oracle + +// OrderRandomFunction returns the SQL function for random ordering. +func (d *Driver) OrderRandomFunction() string { + return "DBMS_RANDOM.VALUE()" +} diff --git a/contrib/drivers/oracle/oracle_z_unit_model_test.go b/contrib/drivers/oracle/oracle_z_unit_model_test.go index 3763564c8..e7e7cf6ef 100644 --- a/contrib/drivers/oracle/oracle_z_unit_model_test.go +++ b/contrib/drivers/oracle/oracle_z_unit_model_test.go @@ -1177,6 +1177,17 @@ func Test_Model_Replace(t *testing.T) { }) } +func Test_OrderRandom(t *testing.T) { + table := createInitTable() + defer dropTable(table) + + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).OrderRandom().All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + }) +} + /* not support the "AS" func Test_Model_Raw(t *testing.T) { table := createInitTable() diff --git a/contrib/drivers/pgsql/pgsql_order.go b/contrib/drivers/pgsql/pgsql_order.go new file mode 100644 index 000000000..6fedce1eb --- /dev/null +++ b/contrib/drivers/pgsql/pgsql_order.go @@ -0,0 +1,12 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package pgsql + +// OrderRandomFunction returns the SQL function for random ordering. +func (d *Driver) OrderRandomFunction() string { + return "RANDOM()" +} diff --git a/contrib/drivers/pgsql/pgsql_z_unit_model_test.go b/contrib/drivers/pgsql/pgsql_z_unit_model_test.go index 781438b76..52571d60d 100644 --- a/contrib/drivers/pgsql/pgsql_z_unit_model_test.go +++ b/contrib/drivers/pgsql/pgsql_z_unit_model_test.go @@ -587,3 +587,14 @@ func Test_Model_OnDuplicateEx(t *testing.T) { t.Assert(one["nickname"], "name_1") }) } + +func Test_OrderRandom(t *testing.T) { + table := createInitTable() + defer dropTable(table) + + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).OrderRandom().All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + }) +} diff --git a/contrib/drivers/sqlite/sqlite_order.go b/contrib/drivers/sqlite/sqlite_order.go new file mode 100644 index 000000000..075e67ef9 --- /dev/null +++ b/contrib/drivers/sqlite/sqlite_order.go @@ -0,0 +1,12 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package sqlite + +// OrderRandomFunction returns the SQL function for random ordering. +func (d *Driver) OrderRandomFunction() string { + return "RANDOM()" +} diff --git a/contrib/drivers/sqlite/sqlite_z_unit_model_test.go b/contrib/drivers/sqlite/sqlite_z_unit_model_test.go index 7734bb5b7..dd0eaba96 100644 --- a/contrib/drivers/sqlite/sqlite_z_unit_model_test.go +++ b/contrib/drivers/sqlite/sqlite_z_unit_model_test.go @@ -4299,3 +4299,14 @@ func TestResult_Structs1(t *testing.T) { t.Assert(array[1].Name, "smith") }) } + +func Test_OrderRandom(t *testing.T) { + table := createInitTable() + defer dropTable(table) + + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).OrderRandom().All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + }) +} diff --git a/database/gdb/gdb.go b/database/gdb/gdb.go index 4d62dea63..490edf8fc 100644 --- a/database/gdb/gdb.go +++ b/database/gdb/gdb.go @@ -178,6 +178,7 @@ type DB interface { ConvertValueForLocal(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) // See Core.ConvertValueForLocal CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue interface{}) (LocalType, error) // See Core.CheckLocalTypeForField FormatUpsert(columns []string, list List, option DoInsertOption) (string, error) // See Core.DoFormatUpsert + OrderRandomFunction() string // See Core.OrderRandomFunction } // TX defines the interfaces for ORM transaction operations. diff --git a/database/gdb/gdb_core_underlying.go b/database/gdb/gdb_core_underlying.go index dec32513a..4616764d4 100644 --- a/database/gdb/gdb_core_underlying.go +++ b/database/gdb/gdb_core_underlying.go @@ -455,6 +455,11 @@ func (c *Core) RowsToResult(ctx context.Context, rows *sql.Rows) (Result, error) return result, nil } +// OrderRandomFunction returns the SQL function for random ordering. +func (c *Core) OrderRandomFunction() string { + return "RAND()" +} + func (c *Core) columnValueToLocalValue(ctx context.Context, value interface{}, columnType *sql.ColumnType) (interface{}, error) { var scanType = columnType.ScanType() if scanType != nil { diff --git a/database/gdb/gdb_model_order_group.go b/database/gdb/gdb_model_order_group.go index 8e25c14da..9f09dabea 100644 --- a/database/gdb/gdb_model_order_group.go +++ b/database/gdb/gdb_model_order_group.go @@ -59,7 +59,7 @@ func (m *Model) OrderDesc(column string) *Model { // OrderRandom sets the "ORDER BY RANDOM()" statement for the model. func (m *Model) OrderRandom() *Model { model := m.getModel() - model.orderBy = "RAND()" + model.orderBy = m.db.OrderRandomFunction() return model }