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 ^^^
    

      

  • 相关阅读:
    阿里开源的那个牛X的问题排查工具——Arthas,推出IDEA插件了!
    Serverless 风起云涌,为什么阿里,微软,AWS 却开始折腾 OAM?
    读书笔记 effective c++ Item 6 如果你不想使用编译器自动生成的函数,你需要明确拒绝
    读书笔记 effective c++ Item 5 了解c++默认生成并调用的函数
    读书笔记 effective c++ Item 4 确保对象被使用前进行初始化
    读书笔记 effective c++ Item 3 在任何可能的时候使用 const
    读书笔记 effective c++ Item 2 尽量使用const,枚举(enums),内联(inlines),不要使用宏定义(define)
    读书笔记 effective c++ Item 1 将c++视为一个语言联邦
    房产知识 集锦
    读书笔记 --TCP :传输控制协议(二)
  • 原文地址:https://www.cnblogs.com/heshana/p/15214760.html
Copyright © 2011-2022 走看看