tanghc 3 years ago
parent
commit
9f7153b23a

+ 4 - 0
changelog.md

@@ -1,5 +1,9 @@
 # changelog
 
+## 1.4.12
+
+- PostgreSQL数据源可指定schema(模板中可使用:`${table.schema}`)
+
 ## 1.4.11
 
 - 优化模板管理交互

+ 4 - 0
front/public/velocity/csharp.json

@@ -91,6 +91,10 @@
         {
           "expression": "${table.comment}",
           "text": "表注释"
+        },
+        {
+          "expression": "${table.schema}",
+          "text": "PostgreSQL中的Schema"
         }
       ]
     },

+ 4 - 0
front/public/velocity/java.json

@@ -107,6 +107,10 @@
         {
           "expression": "${table.comment}",
           "text": "表注释"
+        },
+        {
+          "expression": "${table.schema}",
+          "text": "PostgreSQL中的Schema"
         }
       ]
     },

+ 18 - 1
front/src/views/generate/GenerateConfig/index.vue

@@ -136,6 +136,9 @@
         <el-form-item label="Database" prop="dbName">
           <el-input v-model="datasourceFormData.dbName" placeholder="数据库" show-word-limit maxlength="64" />
         </el-form-item>
+        <el-form-item v-show="showPgSqlSchema" label="Schema" prop="schemaName">
+          <el-input v-model="datasourceFormData.schemaName" placeholder="schema" show-word-limit maxlength="64" />
+        </el-form-item>
         <el-form-item label="Username" prop="username">
           <el-input v-model="datasourceFormData.username" placeholder="用户名" show-word-limit maxlength="100" />
         </el-form-item>
@@ -195,6 +198,12 @@
 </style>
 <script>
 const current_datasource_id_key = "gen-datasource-id"
+const DB_TYPE = {
+  MySQL: 1,
+  Oracle: 2,
+  SQL_Server: 3,
+  PostgreSQL: 4,
+}
 export default {
   name: 'GenerateConfig',
   data() {
@@ -225,6 +234,7 @@ export default {
         username: '',
         password: '',
         dbName: '',
+        schemaName: '',
         packageName: '',
         delPrefix: '',
         groupId: ''
@@ -265,6 +275,11 @@ export default {
       }
     }
   },
+  computed: {
+    showPgSqlSchema() {
+      return this.datasourceFormData.dbType === DB_TYPE.PostgreSQL;
+    }
+  },
   created() {
     this.loadDataSource()
     this.loadTemplate()
@@ -299,7 +314,8 @@ export default {
       return 'hidden-row';
     },
     getDatasourceLabel(item) {
-      return `${item.dbName} (${item.host}) - ${item.username}`
+      const schema = item.schemaName ? `/${item.schemaName}` : ''
+      return `${item.dbName}${schema} (${item.host}) - ${item.username}`
     },
     loadGroups() {
       this.post(`/group/list/`, {}, function(resp) {
@@ -350,6 +366,7 @@ export default {
         this.datasourceFormData[key] = ''
       })
       this.datasourceFormData.id = 0
+      this.datasourceFormData.dbType = 1
       this.datasourceDlgShow = true
       this.$nextTick(() => {
         if (this.groupData.length > 0) {

+ 14 - 1
gen/src/main/java/com/gitee/gen/entity/DatasourceConfig.java

@@ -8,12 +8,17 @@ import java.util.Objects;
  */
 public class DatasourceConfig {
     private Integer id;
-    /** 数据库类型,1:MySql, 2:Oracle, 3:sqlserver */
+    /**
+     * 数据库类型
+     * @see com.gitee.gen.gen.DbType
+     */
     private Integer dbType;
     /** 数据库驱动 */
     private String driverClass;
     /** 数据库名称 */
     private String dbName;
+    /** schema(PGSQL专用) */
+    private String schemaName;
     /** 数据库host */
     private String host;
     /** 数据库端口 */
@@ -127,6 +132,14 @@ public class DatasourceConfig {
         this.groupId = groupId;
     }
 
+    public String getSchemaName() {
+        return schemaName;
+    }
+
+    public void setSchemaName(String schemaName) {
+        this.schemaName = schemaName;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;

+ 9 - 0
gen/src/main/java/com/gitee/gen/gen/GeneratorConfig.java

@@ -8,6 +8,8 @@ public class GeneratorConfig {
     private Integer dbType;
     /** 数据库名称 */
     private String dbName;
+    /** schema(PGSQL专用) */
+    private String schemaName;
     /** 数据库host */
     private String host;
     /** 数据库端口 */
@@ -88,4 +90,11 @@ public class GeneratorConfig {
         this.password = password;
     }
 
+    public String getSchemaName() {
+        return schemaName;
+    }
+
+    public void setSchemaName(String schemaName) {
+        this.schemaName = schemaName;
+    }
 }

+ 13 - 0
gen/src/main/java/com/gitee/gen/gen/TableDefinition.java

@@ -14,6 +14,11 @@ import java.util.List;
 public class TableDefinition {
 
     /**
+     * PSSQL对应的schema
+     */
+    private String schema;
+
+    /**
      * 表名
      */
     private String tableName;
@@ -157,4 +162,12 @@ public class TableDefinition {
     public void setCsharpColumnDefinitions(List<CsharpColumnDefinition> csharpColumnDefinitions) {
         this.csharpColumnDefinitions = csharpColumnDefinitions;
     }
+
+    public String getSchema() {
+        return schema;
+    }
+
+    public void setSchema(String schema) {
+        this.schema = schema;
+    }
 }

+ 10 - 16
gen/src/main/java/com/gitee/gen/gen/TableSelector.java

@@ -25,20 +25,15 @@ public abstract class TableSelector {
      * 查询数据库表的SQL
      * 1.如果是oracle的話則應該傳入用戶名,oracle是根據用戶去管理數據的
      * 2.mysql的话是传入数据库名,mysql和sqlserver是根据数据库去管理的
-     *
-     * @return
+     * @param generatorConfig 配置
+     * @return 返回获取表信息的sql
      */
-    protected abstract String getShowTablesSQL(String showParam);
+    protected abstract String getShowTablesSQL(GeneratorConfig generatorConfig);
 
     protected abstract TableDefinition buildTableDefinition(Map<String, Object> tableMap);
 
     public List<TableDefinition> getTableDefinitions() {
-        String showParam = generatorConfig.getDbName();
-        // 如果是oracle数据库则传oracle数据库用户大写
-        if (generatorConfig.getDriverClass().contains("oracle")) {
-            showParam = generatorConfig.getUsername().toUpperCase();
-        }
-        List<Map<String, Object>> resultList = SqlHelper.runSql(getGeneratorConfig(), getShowTablesSQL(showParam));
+        List<Map<String, Object>> resultList = SqlHelper.runSql(getGeneratorConfig(), getShowTablesSQL(generatorConfig));
         List<TableDefinition> tablesList = new ArrayList<TableDefinition>(resultList.size());
 
         for (Map<String, Object> rowMap : resultList) {
@@ -64,12 +59,7 @@ public abstract class TableSelector {
     }
 
     public List<TableDefinition> getSimpleTableDefinitions() {
-        String showParam = generatorConfig.getDbName();
-        // 如果是oracle数据库则传oracle数据库用户大写
-        if (generatorConfig.getDriverClass().contains("oracle")) {
-            showParam = generatorConfig.getUsername().toUpperCase();
-        }
-        List<Map<String, Object>> resultList = SqlHelper.runSql(getGeneratorConfig(), getShowTablesSQL(showParam));
+        List<Map<String, Object>> resultList = SqlHelper.runSql(getGeneratorConfig(), getShowTablesSQL(generatorConfig));
         List<TableDefinition> tablesList = new ArrayList<TableDefinition>(resultList.size());
 
         for (Map<String, Object> rowMap : resultList) {
@@ -85,10 +75,14 @@ public abstract class TableSelector {
             return Collections.emptyList();
         }
         return schTableNames.stream()
-                .map(tableName -> String.format("'%s'", tableName))
+                .map(this::wrapValue)
                 .collect(Collectors.toList());
     }
 
+    protected String wrapValue(String tableName) {
+        return String.format("'%s'", tableName);
+    }
+
     public GeneratorConfig getGeneratorConfig() {
         return generatorConfig;
     }

+ 3 - 2
gen/src/main/java/com/gitee/gen/gen/mysql/MySqlTableSelector.java

@@ -2,8 +2,8 @@ package com.gitee.gen.gen.mysql;
 
 import com.gitee.gen.gen.ColumnSelector;
 import com.gitee.gen.gen.GeneratorConfig;
-import com.gitee.gen.gen.TableSelector;
 import com.gitee.gen.gen.TableDefinition;
+import com.gitee.gen.gen.TableSelector;
 
 import java.util.Map;
 
@@ -18,7 +18,8 @@ public class MySqlTableSelector extends TableSelector {
 	}
 
 	@Override
-	protected String getShowTablesSQL(String dbName) {
+	protected String getShowTablesSQL(GeneratorConfig generatorConfig) {
+		String dbName = generatorConfig.getDbName();
 		// 兼容dbName包含'-'字段会报错的情况
 		dbName = dbName.contains("-") ? String.format("`%s`",dbName): dbName;
 		String sql = "SHOW TABLE STATUS FROM " + dbName;

+ 5 - 4
gen/src/main/java/com/gitee/gen/gen/oracle/OracleTableSelector.java

@@ -2,8 +2,8 @@ package com.gitee.gen.gen.oracle;
 
 import com.gitee.gen.gen.ColumnSelector;
 import com.gitee.gen.gen.GeneratorConfig;
-import com.gitee.gen.gen.TableSelector;
 import com.gitee.gen.gen.TableDefinition;
+import com.gitee.gen.gen.TableSelector;
 
 import java.util.Map;
 
@@ -22,11 +22,12 @@ public class OracleTableSelector extends TableSelector {
 	 * FROM ALL_TABLES a,USER_TAB_COMMENTS b
 	 * WHERE a.TABLE_NAME=b.TABLE_NAME
 	 * AND a.OWNER='SYSTEM'
-	 * @param showParam
+	 * @param generatorConfig generatorConfig
 	 * @return
 	 */
 	@Override
-	protected String getShowTablesSQL(String showParam) {
+	protected String getShowTablesSQL(GeneratorConfig generatorConfig) {
+		String dbName = generatorConfig.getUsername().toUpperCase();
 		StringBuilder sb = new StringBuilder("");
 		sb.append(" SELECT a.TABLE_NAME as NAME,b.COMMENTS as COMMENTS ");
 		sb.append(" FROM ALL_TABLES a,USER_TAB_COMMENTS b ");
@@ -38,7 +39,7 @@ public class OracleTableSelector extends TableSelector {
 			}
 			sb.append(" AND a.TABLE_NAME IN (" + tables.substring(1) + ")");
 		}
-		sb.append(" AND a.OWNER='"+showParam+"'");
+		sb.append(" AND a.OWNER='"+dbName+"'");
 		return sb.toString();
 	}
 

+ 28 - 11
gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlTableSelector.java

@@ -4,6 +4,7 @@ import com.gitee.gen.gen.ColumnSelector;
 import com.gitee.gen.gen.GeneratorConfig;
 import com.gitee.gen.gen.TableDefinition;
 import com.gitee.gen.gen.TableSelector;
+import org.springframework.util.StringUtils;
 
 import java.util.List;
 import java.util.Map;
@@ -14,32 +15,48 @@ import static com.gitee.gen.util.FieldUtil.convertString;
  * @author tanghc
  */
 public class PostgreSqlTableSelector extends TableSelector {
+
+    private static final String DEFAULT_SCHEMA = "public";
+
     public PostgreSqlTableSelector(ColumnSelector columnSelector, GeneratorConfig generatorConfig) {
         super(columnSelector, generatorConfig);
     }
 
-    private static String SHOW_TABLE_SQL =
-            "SELECT relname, " +
-                "obj_description(oid) AS cmt " +
-            "FROM pg_class C " +
-            "WHERE relkind='r' AND relname NOT LIKE 'pg_%%' AND relname NOT LIKE 'sql_%%' AND relchecks=0 " +
-            "%s " +
-            "ORDER BY relname";
+    private static final String SHOW_TABLE_SQL =
+            "SELECT " +
+                    " t.schemaname, t.tablename, t2.cmt " +
+                    "FROM " +
+                    " pg_tables t LEFT JOIN  " +
+                    " ( " +
+                    " SELECT relname as tablename, obj_description(oid) AS cmt " +
+                    " FROM pg_class C " +
+                    " WHERE relkind='r' AND relname NOT LIKE 'pg_%%' AND relname NOT LIKE 'sql_%%' AND relchecks=0  " +
+                    " ORDER BY relname  " +
+                    ") t2 ON t.tablename = t2.tablename " +
+                    "WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema' %s %s";
 
     @Override
-    protected String getShowTablesSQL(String showParam) {
+    protected String getShowTablesSQL(GeneratorConfig generatorConfig) {
+        String schema = generatorConfig.getSchemaName();
+        if (schema == null) {
+            schema = "";
+        }
+        if (StringUtils.hasText(schema)) {
+            schema = String.format("AND schemaname = '%s'", schema);
+        }
         List<String> tableNames = wrapTableNames();
         String and = "";
         if (!tableNames.isEmpty()) {
-            and = String.format("AND relname IN (%s)  ", String.join(",", tableNames));
+            and = String.format("AND t.tablename in (%s)", String.join(",", tableNames));
         }
-        return String.format(SHOW_TABLE_SQL, and);
+        return String.format(SHOW_TABLE_SQL, schema, and);
     }
 
     @Override
     protected TableDefinition buildTableDefinition(Map<String, Object> tableMap) {
         TableDefinition tableDefinition = new TableDefinition();
-        tableDefinition.setTableName(convertString(tableMap.get("RELNAME")));
+        tableDefinition.setSchema(convertString(tableMap.get("SCHEMANAME")));
+        tableDefinition.setTableName(convertString(tableMap.get("TABLENAME")));
         tableDefinition.setComment(convertString(tableMap.get("CMT")));
         return tableDefinition;
     }

+ 2 - 2
gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerTableSelector.java

@@ -2,8 +2,8 @@ package com.gitee.gen.gen.sqlserver;
 
 import com.gitee.gen.gen.ColumnSelector;
 import com.gitee.gen.gen.GeneratorConfig;
-import com.gitee.gen.gen.TableSelector;
 import com.gitee.gen.gen.TableDefinition;
+import com.gitee.gen.gen.TableSelector;
 
 import java.util.Map;
 
@@ -15,7 +15,7 @@ public class SqlServerTableSelector extends TableSelector {
 	}
 
 	@Override
-	protected String getShowTablesSQL(String dbName) {
+	protected String getShowTablesSQL(GeneratorConfig generatorConfig) {
 		return "SELECT SS.name + '.' + t.name AS table_name " +
 				",ISNULL(ext.value, '') as comment " +
 				"FROM sysobjects t " +

+ 5 - 0
gen/src/main/java/com/gitee/gen/service/UpgradeService.java

@@ -51,6 +51,11 @@ public class UpgradeService {
      */
     public void upgrade() {
         upgradeV1_4_0();
+        upgradeV1_4_12();
+    }
+
+    private void upgradeV1_4_12() {
+        this.addColumn(TABLE_DATASOURCE_CONFIG, "schema_name", "varchar(100)");
     }
 
     /**

+ 14 - 0
gen/src/main/resources/mybatis/DatasourceConfigMapper.xml

@@ -6,6 +6,7 @@
         <result column="db_type" property="dbType" />
         <result column="driver_class" property="driverClass" />
         <result column="db_name" property="dbName" />
+        <result column="schema_name" property="schemaName" />
         <result column="host" property="host" />
         <result column="port" property="port" />
         <result column="username" property="username" />
@@ -22,6 +23,7 @@
         , t.db_type
         , t.driver_class
         , t.db_name
+        , t.schema_name
         , t.host
         , t.port
         , t.username
@@ -57,6 +59,7 @@
             db_type,
             driver_class,
             db_name,
+            schema_name,
             host,
             port,
             username,
@@ -70,6 +73,7 @@
             #{dbType},
             #{driverClass},
             #{dbName},
+            #{schemaName},
             #{host},
             #{port},
             #{username},
@@ -97,6 +101,9 @@
             <if test="dbName != null">
                 db_name,
             </if>
+            <if test="schemaName != null">
+                schema_name,
+            </if>
             <if test="host != null">
                 host,
             </if>
@@ -132,6 +139,9 @@
             <if test="dbName != null" >
                 #{dbName},
             </if>
+            <if test="schemaName != null" >
+                #{schemaName},
+            </if>
             <if test="host != null" >
                 #{host},
             </if>
@@ -166,6 +176,7 @@
             db_type=#{dbType},
             driver_class=#{driverClass},
             db_name=#{dbName},
+            schema_name=#{schemaName},
             host=#{host},
             port=#{port},
             username=#{username},
@@ -192,6 +203,9 @@
             <if test="dbName != null" >
                 db_name=#{dbName},
             </if>
+            <if test="schemaName != null" >
+                schema_name=#{schemaName},
+            </if>
             <if test="host != null" >
                 host=#{host},
             </if>