数据库多版本控制2019
好的,这就是这种情况:您在一个团队中工作,并且每个开发人员都在本地环境中工作。 或者您有多个环境。 或者...我们不在乎。 唯一的一点是,你必须处理不同版本的数据库,你不知道如何安全有效地做到这一点。
数据库的不同版本在数据或结构方面可能有所不同。 在本文中,我们将通过使用带有MySQL示例的关系数据库词汇,着重于管理具有不同结构的不同版本的数据库。 但是,此解决方案可以用于任何类型的数据库,例如NoSQL。
潜在的解决方案
在这里,我们假设您是在一个团队中工作,并且您有一个在人与人之间共享代码的工具(例如:GIT,SVN)。
让我们在项目中创建一个脚本,在其中放置所有数据库演化。 可以是SQL脚本,连接到数据库的任何编程语言的代码或其他解决方案。 这并不重要,唯一的可能就是您可以执行数据库请求。当开发人员想要更改数据库结构时,他将在该文件的末尾编写一段代码(一个或多个请求),并与该文件共享其他人。 重要的是要使该文件保持最新状态并在所有环境中定期运行。
此时,如果多次执行该文件,则肯定会遇到一些错误。 这是有问题的,因为您需要在每次更新时运行此文件。 因此,您必须在每个块上添加条件,并将已执行的块存储到数据库中。 为此,您可以在数据库中创建一个表来存储每个具有唯一ID的演变。 最后,仅当该表上尚未存储ID时,您才运行该块。
就这样。 以下示例说明了该过程。
例
本示例基于一个开发项目,该项目使用MySQL数据库存储一些应用程序数据。 有两个开发人员在其笔记本电脑的本地环境(sso 2开发环境)中进行开发,并且有一个生产环境。 对于每种环境,都有一个数据库。 数据库已经存在,但是我们要确保每个环境上的数据库版本相同(结构相同)。
通常,在项目中,数据库随项目代码一起发展。 因此,如果更新数据库,则必须更新代码,反之亦然。
首先,让我们创建一个表来存储演化。 我们必须在所有数据库上执行此请求:
CREATE TABLE db_evol(
id_evol VARCHAR ( 10 ) PRIMARY KEY NOT NULL
);
现在,让我们在第一个版本中在项目中创建一个文件db_evol.sql。 在这里,我们使用MySQL过程,但我们可以使用其他过程。
delimiter //-- evol1
create procedure evol()
begin
set @id_evol := "evol1" ;
SET @ count := ( select COUNT (*) FROM db_evol WHERE id_evol= @id_evol);
if @count = 0 then
-- This 2 lines correspond to the DB evolution
ALTER TABLE table1 ADD new_col VARCHAR ( 255 );
UPDATE table1 set new_col = 'default value' ;
INSERT INTO db_evol(id_evol) VALUES (@id_evol);
SELECT CONCAT (@id_evol, " executed" );
else
SELECT CONCAT (@id_evol, " skipped" );
end if ;
end //
call evol()//
drop procedure evol//
下一步是第二个想要更新数据库的开发人员。 首先,我检查文件db_evol.sql
是否最新。 如果有更改,我将运行该文件。 之后,我将在文件末尾编写第二个版本并测试脚本。 如果可以,我将更新项目文件。
经过几次发展,所有开发人员都同意更新生产环境。 因此,他们将更新代码并在生产环境上运行脚本db_evol.sql。
结论
本文概述了如何在多个环境中处理数据库版本。 如我们所见,不仅有一种解决方案:您将面对不同的情况。 为了在出现错误的情况下恢复到初始状态,可以在脚本中添加事务或错误处理。
先前发布在 https://4sushi.github.io/#articles/how-to-handle-database-versions
翻译自: https://hackernoon.com/how-to-handle-database-versioning-on-multiple-environments-b45a3v51
数据库多版本控制2019