mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20:25 +08:00 
			
		
		
		
	@@ -156,6 +156,12 @@ func SQLValueNumeric(val any) string {
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%v", val)
 | 
			
		||||
}
 | 
			
		||||
func SQLValueBool(val any) string {
 | 
			
		||||
	if val == nil {
 | 
			
		||||
		return "false"
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%v", cast.ToBool(val))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SQLValueString(val any) string {
 | 
			
		||||
	if val == nil {
 | 
			
		||||
@@ -177,6 +183,12 @@ var (
 | 
			
		||||
		SQLValue: SQLValueNumeric,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	DTBool = &DataType{
 | 
			
		||||
		Name:     "bool",
 | 
			
		||||
		Valuer:   ValuerBit,
 | 
			
		||||
		SQLValue: SQLValueBool,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	DTByte = &DataType{
 | 
			
		||||
		Name:     "uint8",
 | 
			
		||||
		Valuer:   ValuerByte,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,5 @@
 | 
			
		||||
--DM_DB_SCHEMAS 库schemas
 | 
			
		||||
SELECT
 | 
			
		||||
    DISTINCT object_name as SCHEMA_NAME
 | 
			
		||||
FROM ALL_OBJECTS
 | 
			
		||||
WHERE OBJECT_TYPE = 'SCH'
 | 
			
		||||
SELECT NAME as SCHEMA_NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH' ORDER BY NAME ASC
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--DM_TABLE_INFO 表详细信息
 | 
			
		||||
SELECT a.object_name                                      as TABLE_NAME,
 | 
			
		||||
@@ -19,7 +16,7 @@ SELECT a.object_name                                      as TABLE_NAME,
 | 
			
		||||
                       WHERE OWNER = 'wxb'
 | 
			
		||||
                         AND TABLE_NAME = a.object_name)) as INDEX_LENGTH,
 | 
			
		||||
       c.num_rows                                         as TABLE_ROWS
 | 
			
		||||
FROM all_objects a
 | 
			
		||||
FROM SYSOBJECTS a
 | 
			
		||||
         LEFT JOIN ALL_TAB_COMMENTS b ON b.TABLE_TYPE = 'TABLE'
 | 
			
		||||
    AND a.object_name = b.TABLE_NAME
 | 
			
		||||
    AND b.owner = a.owner
 | 
			
		||||
@@ -33,6 +30,18 @@ WHERE a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID))
 | 
			
		||||
    {{end}}
 | 
			
		||||
ORDER BY a.object_name
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--DM_TABLE_INFO_NAME_ONLY 表名列表
 | 
			
		||||
SELECT TABS.NAME as TABLE_NAME FROM
 | 
			
		||||
 (SELECT ID, PID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH' AND NAME = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID))) SCHEMAS,
 | 
			
		||||
 (SELECT ID, SCHID, NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ IN ('UTAB', 'STAB', 'VIEW', 'SYNOM')
 | 
			
		||||
                                       AND ((SUBTYPE$ ='UTAB' AND CAST((INFO3 & 0x00FF & 0x003F) AS INT) not in (9, 27, 29, 25, 12, 7, 21, 23, 18, 5))
 | 
			
		||||
         OR SUBTYPE$ in ('STAB', 'VIEW', 'SYNOM'))) TABS
 | 
			
		||||
WHERE TABS.SCHID = SCHEMAS.ID 
 | 
			
		||||
  AND SF_CHECK_PRIV_OPT(UID(), CURRENT_USERTYPE(), TABS.ID, SCHEMAS.PID, -1, TABS.ID) = 1
 | 
			
		||||
{{if .tableNames}}
 | 
			
		||||
    and TABS.NAME in ({{.tableNames}})
 | 
			
		||||
{{end}}
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--DM_INDEX_INFO 表索引信息
 | 
			
		||||
select a.index_name                                        as INDEX_NAME,
 | 
			
		||||
       a.index_type                                        as INDEX_TYPE,
 | 
			
		||||
@@ -81,4 +90,23 @@ from all_tab_columns a
 | 
			
		||||
where a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID))
 | 
			
		||||
  and a.table_name in (%s)
 | 
			
		||||
order by a.table_name,
 | 
			
		||||
         a.column_id
 | 
			
		||||
         a.column_id
 | 
			
		||||
---------------------------------------
 | 
			
		||||
--DM_COLUMN_MA_EX 表列信息
 | 
			
		||||
SELECT
 | 
			
		||||
    TABS.TABLE_NAME           TABLE_NAME,
 | 
			
		||||
    COLS.NAME                 COLUMN_NAME,
 | 
			
		||||
    case when COLS.NULLABLE$ = 'Y' then 'YES' when COLS.NULLABLE$ = 'N' then 'NO' else 'NO' end as NULLABLE,
 | 
			
		||||
    COLS.TYPE$                DATA_TYPE,
 | 
			
		||||
    COLS.LENGTH$              CHAR_MAX_LENGTH,
 | 
			
		||||
    COLS.SCALE                NUM_SCALE,
 | 
			
		||||
    COLS.DEFVAL               COLUMN_DEFAULT,
 | 
			
		||||
    case when COLS.INFO2 & 0x01 = 0x01 then 1 else 0 end  as IS_IDENTITY,
 | 
			
		||||
    case when COLS.INFO2 & 0x01 = 0x01 then 1 else 0 end  as IS_PRIMARY_KEY
 | 
			
		||||
 | 
			
		||||
FROM
 | 
			
		||||
    (SELECT ID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH' AND NAME = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID))) SCHS,
 | 
			
		||||
    (SELECT ID,SCHID,NAME TABLE_NAME FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ IN ('UTAB', 'STAB', 'VIEW') AND NAME  in (%s)) TABS,
 | 
			
		||||
    SYS.SYSCOLUMNS COLS
 | 
			
		||||
 | 
			
		||||
WHERE TABS.ID = COLS.ID AND SCHS.ID = TABS.SCHID;
 | 
			
		||||
@@ -15,6 +15,7 @@ const (
 | 
			
		||||
	CTLongtext
 | 
			
		||||
 | 
			
		||||
	CTBit  // 1 bit
 | 
			
		||||
	CTBool // 1 bit
 | 
			
		||||
	CTInt1 // 1字节 -128~127
 | 
			
		||||
	CTInt2 // 2字节 -32768~32767
 | 
			
		||||
	CTInt4 // 4字节 -2147483648~2147483647
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"mayfly-go/internal/db/dbm/dbi"
 | 
			
		||||
	"mayfly-go/pkg/errorx"
 | 
			
		||||
	"mayfly-go/pkg/logx"
 | 
			
		||||
	"mayfly-go/pkg/utils/anyx"
 | 
			
		||||
	"mayfly-go/pkg/utils/collx"
 | 
			
		||||
	"mayfly-go/pkg/utils/stringx"
 | 
			
		||||
@@ -13,11 +14,13 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	DM_META_FILE      = "metasql/dm_meta.sql"
 | 
			
		||||
	DM_DB_SCHEMAS     = "DM_DB_SCHEMAS"
 | 
			
		||||
	DM_TABLE_INFO_KEY = "DM_TABLE_INFO"
 | 
			
		||||
	DM_INDEX_INFO_KEY = "DM_INDEX_INFO"
 | 
			
		||||
	DM_COLUMN_MA_KEY  = "DM_COLUMN_MA"
 | 
			
		||||
	DM_META_FILE            = "metasql/dm_meta.sql"
 | 
			
		||||
	DM_DB_SCHEMAS           = "DM_DB_SCHEMAS"
 | 
			
		||||
	DM_TABLE_INFO_KEY       = "DM_TABLE_INFO"
 | 
			
		||||
	DM_TABLE_INFO_NAME_ONLY = "DM_TABLE_INFO_NAME_ONLY" // 当查询表详情失败时,可能是因为没有系统表查询权限,所以尝试只查表名
 | 
			
		||||
	DM_INDEX_INFO_KEY       = "DM_INDEX_INFO"
 | 
			
		||||
	DM_COLUMN_MA_KEY        = "DM_COLUMN_MA"
 | 
			
		||||
	DM_COLUMN_MA_EX_KEY     = "DM_COLUMN_MA_EX"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type DMMetadata struct {
 | 
			
		||||
@@ -67,7 +70,12 @@ func (dd *DMMetadata) GetTables(tableNames ...string) ([]dbi.Table, error) {
 | 
			
		||||
 | 
			
		||||
	_, res, err = dd.dc.Query(sql)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		// 尝试只查表名
 | 
			
		||||
		sql, err = stringx.TemplateParse(dbi.GetLocalSql(DM_META_FILE, DM_TABLE_INFO_NAME_ONLY), collx.M{"tableNames": names})
 | 
			
		||||
		_, res, err = dd.dc.Query(sql)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tables := make([]dbi.Table, 0)
 | 
			
		||||
@@ -93,7 +101,10 @@ func (dd *DMMetadata) GetColumns(tableNames ...string) ([]dbi.Column, error) {
 | 
			
		||||
 | 
			
		||||
	_, res, err := dd.dc.Query(fmt.Sprintf(dbi.GetLocalSql(DM_META_FILE, DM_COLUMN_MA_KEY), tableName))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		_, res, err = dd.dc.Query(fmt.Sprintf(dbi.GetLocalSql(DM_META_FILE, DM_COLUMN_MA_EX_KEY), tableName))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	columns := make([]dbi.Column, 0)
 | 
			
		||||
@@ -138,7 +149,8 @@ func (dd *DMMetadata) GetPrimaryKey(tablename string) (string, error) {
 | 
			
		||||
func (dd *DMMetadata) GetTableIndex(tableName string) ([]dbi.Index, error) {
 | 
			
		||||
	_, res, err := dd.dc.Query(fmt.Sprintf(dbi.GetLocalSql(DM_META_FILE, DM_INDEX_INFO_KEY), tableName))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		logx.Error("查询达梦索引信息失败", err)
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	indexs := make([]dbi.Index, 0)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	Bool        = dbi.NewDbDataType("bool", dbi.DTBit).WithCT(dbi.CTBit).WithFixColumn(dbi.ClearNumScale)
 | 
			
		||||
	Bool        = dbi.NewDbDataType("bool", dbi.DTBool).WithCT(dbi.CTBool).WithFixColumn(dbi.ClearNumScale)
 | 
			
		||||
	Int2        = dbi.NewDbDataType("int2", dbi.DTInt16).WithCT(dbi.CTInt2).WithFixColumn(dbi.ClearNumScale)
 | 
			
		||||
	Int4        = dbi.NewDbDataType("int4", dbi.DTInt32).WithCT(dbi.CTInt4).WithFixColumn(dbi.ClearNumScale)
 | 
			
		||||
	Int8        = dbi.NewDbDataType("int8", dbi.DTInt64).WithCT(dbi.CTInt8).WithFixColumn(dbi.ClearNumScale)
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,6 @@ type DbSql struct {
 | 
			
		||||
	DbId uint64 `json:"dbId" gorm:"not null;"`
 | 
			
		||||
	Db   string `json:"db" gorm:"size:100;not null;"`
 | 
			
		||||
	Type int    `json:"type" gorm:"not null;"` // 类型
 | 
			
		||||
	Sql  string `json:"sql" gorm:"type:text;comment:sql语句"`
 | 
			
		||||
	Sql  string `json:"sql" gorm:"type:longtext;comment:sql语句"`
 | 
			
		||||
	Name string `json:"name" gorm:"size:255;not null;comment:sql模板名"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user