sys_auto_code_pgsql.go 3.4 KB

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