zoukankan      html  css  js  c++  java
  • springboot初始化执行mysql脚本修改库表结构

    项目启动会执行脚本,修改mysql库表的结构、数据

    1.项目每次重启都会执行脚本,修改,添加、删除表、表结构会报错。

    2.数据重复新增会报错。

    3.数据重复修改导致准确性问题。

    解决方案:

    1.通过版本来控制,检查数据库中版本和程序中版本是否一致,数据库中版本低时则依次更新每个版本的脚本,最后将数据库中版本号更新。

    2.在脚本中刷入存储过程,存储过程中对每一类操作进行定义。给出操作类型和表参数, 检查参数sql是否可执行,然后拼接 sql进行执行。

    说明:

    方案1的业务逻辑有点复杂。 取resource,解析版本号,正确拆解sql,读取数据库版本后比对……需要一整套的逻辑处理。采用方案2.

    实现:

    1.借助springboot 的启动执行sql    --DataSourceInitializer 

    @Component
    public class CustomizeDataSourceInitializer  {
    
        @Value ("classpath:sql/schema.sql")
        private Resource dataScript;
    
        @Autowired
        DataSource dataSource;
    
        @Bean
        public DataSourceInitializer dataSourceInitializer( ) {
            final DataSourceInitializer initializer = new DataSourceInitializer();
            // 设置数据源
            initializer.setDataSource(dataSource);
            initializer.setDatabasePopulator(databasePopulator());
            return initializer;
        }
    
        private DatabasePopulator databasePopulator() {
     
            final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
         //此处修改了分隔符  populator.setSeparator( ScriptUtils.EOF_STATEMENT_SEPARATOR ); populator.addScripts(dataScript); System.out.println("==================sql脚本初始化完成=================="); return populator; } }

    2.resource添加脚本sql/schema.sql

    ------------------------- 中文无法执行 ----------------------------------
    
    
    
     DROP PROCEDURE IF EXISTS Pro_Temp_ColumnWork;
     ^^^ END OF SCRIPT ^^^
    
    -- 1表示新增列,2表示修改列类型,3表示删除列
     CREATE PROCEDURE Pro_Temp_ColumnWork(TableName VARCHAR(50),ColumnName VARCHAR(50),SqlStr VARCHAR(4000),CType INT)
    BEGIN
    DECLARE Rows1 INT ;
    SET Rows1=0 ;
    SELECT COUNT(*) INTO Rows1  FROM INFORMATION_SCHEMA.Columns
    WHERE table_schema= DATABASE() AND table_name=TableName AND column_name=ColumnName ;
    -- 新增列
    IF (CType=1 AND Rows1<=0) THEN
    SET SqlStr := CONCAT( 'ALTER TABLE ',TableName,' ADD COLUMN ',ColumnName,' ',SqlStr) ;
    -- 修改列类型
    ELSEIF (CType=2 AND Rows1>0)  THEN
    SET SqlStr := CONCAT('ALTER TABLE ',TableName,' MODIFY  ',ColumnName,' ',SqlStr) ;
    -- 删除列
    ELSEIF (CType=3 AND Rows1>0) THEN
    SET SqlStr := CONCAT('ALTER TABLE  ',TableName,' DROP COLUMN  ',ColumnName) ;
    ELSE  SET SqlStr :='' ;
    END IF ;
    -- 执行命令
    IF (SqlStr<>'') THEN
    SET @SQL1 = SqlStr ;
    PREPARE stmt1 FROM @SQL1 ;
    EXECUTE stmt1 ;
    END IF ;
    END;
    ^^^ END OF SCRIPT ^^^
    -- alter table gd_device_group  modify column device_group_description varchar(255) COMMENT '设备分组描述';
    call   Pro_Temp_ColumnWork("table_name","colum_name","varchar(255) COMMENT ' testcaaa '",2)
    
    ^^^ END OF SCRIPT ^^^
    

      

  • 相关阅读:
    NGUI本地化
    Unity中的特殊文件夹
    NGUI3.7.4实现循环拖动
    一年
    倒计时 功能
    PV inverter启动 ----系列二
    关于几个其他的命令使用 【实时更新】
    QT学习系列-----5 --Qt 4.8.5的移植
    QT学习系列-----4 --Qt 版本及qwt
    经典数字信号处理图书的个人评述【转】
  • 原文地址:https://www.cnblogs.com/heshana/p/15214760.html
Copyright © 2011-2022 走看看