c – 如何在安装程序中自动创建(My)Sql ALTER脚本?

在软件安装程序中,我需要自动创建一个(My)SQL ALTER脚本,只需要一个处于未知状态的运行数据库(例如数据结构版本x.5)和一些完整的DB(My)SQL CREATE脚本(比如版本) x.1至x.9).

首先,我需要找到当前正在运行的(或者如果可能的话,最近的版本,可能是某些安装有一些早期的更新错误,但此功能是次要的).然后,我想创建一个ALTER脚本来修复正在运行的版本的可能错误.

之后我想自动创建一个ALTER脚本到最新版本(x.9)并应用这个脚本.再次比较两个版本并重复,直到版本是最新的.

我不能使用GUI-Application,因为这必须在安装程序中盲目运行.目标平台将是Windows XP / 7.分期付款将在很长一段时间内低于300(高度专业化的行业软件的更新软件).所以我的问题是:

是否有用于C / NSIS / Some-Other-Installer-Frameworks的好的(My)SQL比较/差异/脚本生成库?

感谢您的支持!

解决方法:

我很长一段时间都在思考同一个话题,但没有找到一个体面的方式.我会分享我的所作所为,希望它会有所帮助.

我目前的方法是应用一个SQL查询列表,这些查询的设计方式适用于任何以前的数据库模式版本.如果该命令已经应用,那么它将失败(例如添加字段或添加索引).

这种方法限制了人们可以改变数据库模式的方式,也容易出错 – 例如如果错误地有查询将ENUM(a,b)字段扩展到ENUM(a,b,c)然后再转到ENUM(a,b,c,d),那么如果运行,则值为d的现有记录将被破坏再次编写脚本.如果最新格式只有一个查询,则可以轻松修复此问题.

我还在稍后添加了模式版本控制,目前使用简单但易于管理的更新文件格式 – 每行一个查询结束;和额外的行分隔架构版本:

-- version 105

使用此升级代码可以大大简化并统一在一个函数中,该函数将处理所有版本转换.该函数只需在–version< current version>之后处理查询.线.在到达 – 版本行之后,该函数更新数据库内的模式版本.

此格式也允许使用mysql -f mydb< myfile命令.在这种情况下,版本行只会被忽略,因为所有更改的注释和所有命令都将在当前模式上尝试 - 这可用于修复错误(通过错误我假设您的模式比预期更旧).更新存储过程代码也有类似的技巧:

drop procedure if exists procname;
delimiter //
create procedure procname ...
//
delimiter ;

在您的问题中,您询问有关DB模式差异/补丁的问题 – 这只能在添加新字段/索引/等的情况下进行推广.但无法自动处理重命名的字段或已删除的字段.通过查看现有模式和新模式并保留现有数据(我假设现有数据必须保持完整),自动化流程无法知道table1中的字段a应该重命名为b.

总而言之 – 在一般情况下,没有自动生成数据库架构更新脚本的方法.

上一篇:NSI脚本右键的编译选项消失


下一篇:java – NSIS Eclipse插件不能正常工作