Przeglądaj źródła

优化sql转换

life 1 rok temu
rodzic
commit
dfb8cbc3bf

+ 31 - 10
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ddl/impl/DDLParserImpl.java

@@ -3,8 +3,11 @@ package org.dbsyncer.parser.ddl.impl;
 import java.util.List;
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.Statement;
 import net.sf.jsqlparser.statement.alter.Alter;
 import net.sf.jsqlparser.statement.alter.AlterExpression;
+import net.sf.jsqlparser.statement.alter.AlterOperation;
 import org.dbsyncer.connector.config.DDLConfig;
 import org.dbsyncer.parser.ddl.DDLParser;
 import org.dbsyncer.parser.model.FieldMapping;
@@ -12,6 +15,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+/**
+ * alter情况:<br>
+ * 情况1:只是修改字段的属性值<br>
+ * 情况2:修改字段的名称
+ *
+ */
 @Component
 public class DDLParserImpl implements DDLParser {
 
@@ -23,20 +32,31 @@ public class DDLParserImpl implements DDLParser {
         DDLConfig ddlConfig = new DDLConfig();
         // TODO life 替换为目标库执行SQL
         try {
-            Alter alter = (Alter) CCJSqlParserUtil.parse(sql);
-            for (AlterExpression alterExpression:alter.getAlterExpressions()) {
-                for (AlterExpression.ColumnDataType columnDataType:alterExpression.getColDataTypeList()) {
-                    String columName = columnDataType.getColumnName();
-                    columName = columName.replaceAll("`","");
-                    for (FieldMapping fieldMapping :fieldMappingList) {
-                        if (fieldMapping.getSource().getName().equals(columName)){
-                            columnDataType.setColumnName(fieldMapping.getTarget().getName());
-                            break;
+            Statement statement = CCJSqlParserUtil.parse(sql);
+            if (statement instanceof  Alter){ //alter语句
+                Alter alter = (Alter) statement;
+                //先替换成目标表名
+                alter.setTable(new Table(targetTableName));
+                for (AlterExpression alterExpression:alter.getAlterExpressions()) {
+                    AlterOperation operation =alterExpression.getOperation();
+                    if (operation == AlterOperation.MODIFY){//修改列的属性
+                        for (AlterExpression.ColumnDataType columnDataType:alterExpression.getColDataTypeList()) {
+                            String columName = columnDataType.getColumnName();
+                            columName = columName.replaceAll("`","");
+                            for (FieldMapping fieldMapping :fieldMappingList) {
+                                if (fieldMapping.getSource().getName().equals(columName)){
+                                    columnDataType.setColumnName(fieldMapping.getTarget().getName());
+                                    break;
+                                }
+                            }
                         }
+                        sql = alter.toString();
+                    }else if (operation == AlterOperation.CHANGE){//修改列名
+
                     }
+
                 }
             }
-            sql = alter.toString();
             logger.info("目标sql为"+sql);
         } catch (JSQLParserException e) {
             logger.error(e.getMessage(), e);
@@ -44,4 +64,5 @@ public class DDLParserImpl implements DDLParser {
         ddlConfig.setSql(sql);
         return ddlConfig;
     }
+
 }

+ 4 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/GeneralBufferActuator.java

@@ -28,6 +28,7 @@ import org.dbsyncer.parser.strategy.FlushStrategy;
 import org.dbsyncer.parser.util.ConvertUtil;
 import org.dbsyncer.parser.util.PickerUtil;
 import org.dbsyncer.plugin.PluginFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
@@ -75,6 +76,7 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
     @Resource
     private DDLParser ddlParser;
 
+
     @PostConstruct
     public void init() {
         setConfig(generalBufferConfig);
@@ -186,6 +188,7 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
         }
         // TODO life
         // 1.获取目标表最新的属性字段
+
         // 2.更新TableGroup.targetTable
         // 3.更新表字段映射(添加相似字段)
         // 4.更新TableGroup.command
@@ -209,4 +212,5 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
     public void setGeneralExecutor(Executor generalExecutor) {
         this.generalExecutor = generalExecutor;
     }
+
 }