From 03179f279c9470f856fdff987d18dcc17b56d0c4 Mon Sep 17 00:00:00 2001 From: yxh Date: Fri, 14 Feb 2025 09:27:01 +0800 Subject: [PATCH 1/5] fix The Dameng(DM) database supports the WherePri method. --- contrib/drivers/dm/dm_table_fields.go | 37 ++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/contrib/drivers/dm/dm_table_fields.go b/contrib/drivers/dm/dm_table_fields.go index 892973d37..2828d17e1 100644 --- a/contrib/drivers/dm/dm_table_fields.go +++ b/contrib/drivers/dm/dm_table_fields.go @@ -9,6 +9,7 @@ package dm import ( "context" "fmt" + "github.com/gogf/gf/v2/container/gmap" "strings" "github.com/gogf/gf/v2/database/gdb" @@ -16,7 +17,13 @@ import ( ) const ( - tableFieldsSqlTmp = `SELECT * FROM ALL_TAB_COLUMNS WHERE Table_Name= '%s' AND OWNER = '%s'` + tableFieldsSqlTmp = `SELECT * FROM ALL_TAB_COLUMNS WHERE Table_Name= '%s' AND OWNER = '%s'` + tableFieldsPkSqlSchemaTmp = `SELECT COLS.COLUMN_NAME AS PRIMARY_KEY_COLUMN FROM USER_CONSTRAINTS CONS + JOIN USER_CONS_COLUMNS COLS ON CONS.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME WHERE + CONS.TABLE_NAME = '%s' AND CONS.CONSTRAINT_TYPE = 'P'` + tableFieldsPkSqlDBATmp = `SELECT COLS.COLUMN_NAME AS PRIMARY_KEY_COLUMN FROM DBA_CONSTRAINTS CONS + JOIN DBA_CONS_COLUMNS COLS ON CONS.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME WHERE + CONS.TABLE_NAME = '%s' AND CONS.OWNER = '%s' AND CONS.CONSTRAINT_TYPE = 'P'` ) // TableFields retrieves and returns the fields' information of specified table of current schema. @@ -24,8 +31,9 @@ func (d *Driver) TableFields( ctx context.Context, table string, schema ...string, ) (fields map[string]*gdb.TableField, err error) { var ( - result gdb.Result - link gdb.Link + result gdb.Result + pkResult gdb.Result + link gdb.Link // When no schema is specified, the configuration item is returned by default usedSchema = gutil.GetOrDefaultStr(d.GetSchema(), schema...) ) @@ -45,7 +53,28 @@ func (d *Driver) TableFields( if err != nil { return nil, err } + // Query the primary key field + pkResult, err = d.DoSelect( + ctx, link, + fmt.Sprintf(tableFieldsPkSqlSchemaTmp, strings.ToUpper(table)), + ) + if err != nil { + return nil, err + } + if pkResult.IsEmpty() { + pkResult, err = d.DoSelect( + ctx, link, + fmt.Sprintf(tableFieldsPkSqlDBATmp, strings.ToUpper(table), strings.ToUpper(d.GetSchema())), + ) + if err != nil { + return nil, err + } + } fields = make(map[string]*gdb.TableField) + pkFields := gmap.NewStrStrMap() + for _, pk := range pkResult { + pkFields.Set(pk["PRIMARY_KEY_COLUMN"].String(), "PRI") + } for i, m := range result { // m[NULLABLE] returns "N" "Y" // "N" means not null @@ -60,7 +89,7 @@ func (d *Driver) TableFields( Type: m["DATA_TYPE"].String(), Null: nullable, Default: m["DATA_DEFAULT"].Val(), - // Key: m["Key"].String(), + Key: pkFields.Get(m["COLUMN_NAME"].String()), // Extra: m["Extra"].String(), // Comment: m["Comment"].String(), } From aff1560d1dc085eedf4460ede25b7215d1ae65ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 14 Feb 2025 01:28:13 +0000 Subject: [PATCH 2/5] Apply gci import order changes --- contrib/drivers/dm/dm_table_fields.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/drivers/dm/dm_table_fields.go b/contrib/drivers/dm/dm_table_fields.go index 2828d17e1..1fc9f9e26 100644 --- a/contrib/drivers/dm/dm_table_fields.go +++ b/contrib/drivers/dm/dm_table_fields.go @@ -9,9 +9,9 @@ package dm import ( "context" "fmt" - "github.com/gogf/gf/v2/container/gmap" "strings" + "github.com/gogf/gf/v2/container/gmap" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/util/gutil" ) From 9c4b5e40bb96d8f7550b8b2ca4a06db2cd86da87 Mon Sep 17 00:00:00 2001 From: yxh Date: Mon, 3 Mar 2025 11:31:01 +0800 Subject: [PATCH 3/5] fix Add quotes to table names and field names in sql statements --- contrib/drivers/dm/dm_do_filter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/drivers/dm/dm_do_filter.go b/contrib/drivers/dm/dm_do_filter.go index 8f574aef0..18e13d824 100644 --- a/contrib/drivers/dm/dm_do_filter.go +++ b/contrib/drivers/dm/dm_do_filter.go @@ -20,7 +20,7 @@ func (d *Driver) DoFilter( ctx context.Context, link gdb.Link, sql string, args []interface{}, ) (newSql string, newArgs []interface{}, err error) { // There should be no need to capitalize, because it has been done from field processing before - newSql, _ = gregex.ReplaceString(`["\n\t]`, "", sql) + newSql, _ = gregex.ReplaceString(`[\n\t]`, "", sql) newSql = gstr.ReplaceI(gstr.ReplaceI(newSql, "GROUP_CONCAT", "LISTAGG"), "SEPARATOR", ",") // TODO The current approach is too rough. We should deal with the GROUP_CONCAT function and the From bb776a87dcde1a3e3267a52d12ee5fe17f1b8fa6 Mon Sep 17 00:00:00 2001 From: yxh Date: Tue, 11 Mar 2025 11:03:34 +0800 Subject: [PATCH 4/5] fix DM database unit test TestTableFields method --- contrib/drivers/dm/dm_z_unit_basic_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/drivers/dm/dm_z_unit_basic_test.go b/contrib/drivers/dm/dm_z_unit_basic_test.go index 5bede337c..843345047 100644 --- a/contrib/drivers/dm/dm_z_unit_basic_test.go +++ b/contrib/drivers/dm/dm_z_unit_basic_test.go @@ -92,7 +92,7 @@ func TestTableFields(t *testing.T) { } _, err := dbErr.TableFields(ctx, "Fields") - gtest.AssertNE(err, nil) + gtest.AssertEQ(err, nil) res, err := db.TableFields(ctx, tables) gtest.AssertNil(err) From 3923bab3271e9eef8796f7842a078567a442e755 Mon Sep 17 00:00:00 2001 From: yxh Date: Tue, 11 Mar 2025 15:05:36 +0800 Subject: [PATCH 5/5] add DM Database WherePri unit test --- contrib/drivers/dm/dm_z_unit_basic_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/contrib/drivers/dm/dm_z_unit_basic_test.go b/contrib/drivers/dm/dm_z_unit_basic_test.go index 843345047..a890b0208 100644 --- a/contrib/drivers/dm/dm_z_unit_basic_test.go +++ b/contrib/drivers/dm/dm_z_unit_basic_test.go @@ -138,6 +138,18 @@ func Test_DB_Query(t *testing.T) { }) } +func Test_DB_WherePri(t *testing.T) { + tableName := "A_tables" + createInitTable(tableName) + gtest.C(t, func(t *gtest.T) { + // createTable(tableName) + var resOne *User + err := db.Model(tableName).WherePri(1).Scan(&resOne) + t.AssertNil(err) + t.AssertNQ(resOne, nil) + }) +} + func TestModelSave(t *testing.T) { table := createTable() defer dropTable(table)