zhangqian
2023-08-26 5193dcb9336e853502baf8a539d3f45efebe2f86
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package system
 
import (
    "github.com/pkg/errors"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
    "srm/global"
    "srm/model/system/response"
)
 
var AutoCodePgsql = new(autoCodePgsql)
 
type autoCodePgsql struct{}
 
// GetDB 获取数据库的所有数据库名
// Author [piexlmax](https://github.com/piexlmax)
// Author [SliverHorn](https://github.com/SliverHorn)
func (a *autoCodePgsql) GetDB(businessDB string) (data []response.Db, err error) {
    var entities []response.Db
    sql := `SELECT datname as database FROM pg_database WHERE datistemplate = false`
    if businessDB == "" {
        err = global.GVA_DB.Raw(sql).Scan(&entities).Error
    } else {
        err = global.GVA_DBList[businessDB].Raw(sql).Scan(&entities).Error
    }
 
    return entities, err
}
 
// GetTables 获取数据库的所有表名
// Author [piexlmax](https://github.com/piexlmax)
// Author [SliverHorn](https://github.com/SliverHorn)
func (a *autoCodePgsql) GetTables(businessDB string, dbName string) (data []response.Table, err error) {
    var entities []response.Table
    sql := `select table_name as table_name from information_schema.tables where table_catalog = ? and table_schema = ?`
    db, _err := gorm.Open(postgres.Open(global.GVA_CONFIG.Pgsql.LinkDsn(dbName)), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
    if _err != nil {
        return nil, errors.Wrapf(err, "[pgsql] 连接 数据库(%s)的表失败!", dbName)
    }
 
    err = db.Raw(sql, dbName, "public").Scan(&entities).Error
    return entities, err
}
 
// GetColumn 获取指定数据库和指定数据表的所有字段名,类型值等
// Author [piexlmax](https://github.com/piexlmax)
// Author [SliverHorn](https://github.com/SliverHorn)
func (a *autoCodePgsql) GetColumn(businessDB string, tableName string, dbName string) (data []response.Column, err error) {
    // todo 数据获取不全, 待完善sql
    sql := `
        SELECT psc.COLUMN_NAME AS COLUMN_NAME,
 psc.udt_name AS data_type,
CASE
  psc.udt_name 
  WHEN 'text' THEN
   concat_ws ( '', '', psc.CHARACTER_MAXIMUM_LENGTH ) 
  WHEN 'varchar' THEN
   concat_ws ( '', '', psc.CHARACTER_MAXIMUM_LENGTH ) 
  WHEN 'smallint' THEN
   concat_ws ( ',', psc.NUMERIC_PRECISION, psc.NUMERIC_SCALE ) 
  WHEN 'decimal' THEN
   concat_ws ( ',', psc.NUMERIC_PRECISION, psc.NUMERIC_SCALE ) 
  WHEN 'integer' THEN
   concat_ws ( '', '', psc.NUMERIC_PRECISION ) 
  WHEN 'int4' THEN
   concat_ws ( '', '', psc.NUMERIC_PRECISION ) 
  WHEN 'int8' THEN
   concat_ws ( '', '', psc.NUMERIC_PRECISION ) 
  WHEN 'bigint' THEN
   concat_ws ( '', '', psc.NUMERIC_PRECISION ) 
  WHEN 'timestamp' THEN
   concat_ws ( '', '', psc.datetime_precision ) 
  ELSE '' 
 END AS data_type_long,
 (
   SELECT
    pd.description 
   FROM
    pg_description pd 
   WHERE
    (pd.objoid,pd.objsubid) in (
       SELECT pa.attrelid,pa.attnum
       FROM
        pg_attribute pa 
      WHERE pa.attrelid = ( SELECT oid FROM pg_class pc WHERE 
      pc.relname = psc.table_name
      ) 
      and attname = psc.column_name
    ) 
 ) AS column_comment 
FROM
 INFORMATION_SCHEMA.COLUMNS psc 
WHERE
 table_catalog = ?
 AND table_schema = 'public' 
 AND TABLE_NAME = ?;
    `
    var entities []response.Column
    db, _err := gorm.Open(postgres.Open(global.GVA_CONFIG.Pgsql.LinkDsn(dbName)), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
    if _err != nil {
        return nil, errors.Wrapf(err, "[pgsql] 连接 数据库(%s)的表(%s)失败!", dbName, tableName)
    }
    //sql = strings.ReplaceAll(sql, "@table_catalog", dbName)
    //sql = strings.ReplaceAll(sql, "@table_name", tableName)
    err = db.Raw(sql, dbName, tableName).Scan(&entities).Error
    return entities, err
}