所以在这种情况下,我将多次获取整个数据库模式。但每次表结构可能与前一个略有不同。由于我已经在里面有数据,有没有办法编写查询以与现有表进行比较并添加新列?
例如,我的数据库中已经有这个表。
CREATE TABLE `Ages` (
`AgeID` int(11) DEFAULT NULL,
`AgeName` varchar(32) DEFAULT NULL,
`AgeAbbreviation` varchar(13) DEFAULT NULL,
`YouthAge` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
在我得到的新架构中,它具有相同的表,但具有不同的列。CREATE TABLE `Ages` (
`AgeID` int(11) DEFAULT NULL,
`AgeName` varchar(32) DEFAULT NULL,
`AgeAbbreviation` varchar(13) DEFAULT NULL,
`YouthAge` varchar(15) DEFAULT NULL,
`AgeLimit` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
在这种情况下,列AgeLimit
将添加到现有表中。
您应该能够通过查看元数据表中的表定义来执行此操作 (information_schema)。
- 您始终可以使用保存元数据的
information_schema
数据库查看现有架构。
然后,您可以将新架构 - 导入临时数据库,根据新架构创建所有表,然后再次查看元数据。
- 也许能够在存储过程中使用动态 sql在运行时执行根据该差异创建的
alter table
语句
但我认为,从后端nodejs服务器开始这要容易得多,因为您也可以从nodejs轻松执行步骤1和2(实际上只是查询一堆表),并且您有更多可能性来计算差异,创建和执行适当的查询。
编辑 1
如果您无法从新架构创建临时数据库,则必须找到其他方法从中提取信息。我怀疑你有一个sql脚本,其中包含(除其他外)一堆CREATE TABLE ...
语句,因为这通常是mysqldump
创建的内容。因此,您必须解析此脚本。同样,这在javascript中似乎更容易,如果在MySQL存储过程中甚至可以的话。如果您的架构与您的示例一样结构良好,则它实际上只是几行代码。
编辑 2
也许你可以从这里获得一些灵感: 比较两个MySQL数据库 提到了一些在数据库之间进行同步的工具。