我是一个开发一个非常大的web应用程序的团队的新手。在我开始之前,团队已经实现了0的自动化,并且只是手工完成了所有的工作。这是可能的,因为他们只是一支只有2人的球队。我现在正在逐渐改变这一点,但很明显,我不能让每个人从零开始,“做好”。
我所面临的一个问题是对数据库中的数据(而不是模式)的更改。数据库中配置了很多东西,例如翻译、导航、角色/权限和邮件模板。幸运的是,这些通常只是由团队定义,并被推进到阶段/生产,而不是两种方式。
我们的设置是每个开发人员都有自己的开发环境和自己的数据库。然后是一个分期和生产环境。其思想是,开发人员可以在他的开发工具框上创建他的新导航条目、权限和翻译,然后以某种方式将这些更改应用到( a)其他开发工具的框和( b)暂存和生产中。
监视这些更改的明显方法是将它们存储为代码或SQL文件,但是考虑到邮件模板将其数据存储在3-4个表中并具有外键,这会变得非常棘手。另一种方法是创建导出/导入功能,但这将非常耗时。
我知道以前已经讨论过这个主题,但是讨论的结尾通常是“跟踪您在顺序sql或代码文件中的更改”。我希望听到其他团队正在做什么,也许甚至有一个非常好的工具来处理这个问题呢?
发布于 2015-08-18 12:46:28
SQL脚本是正确的方法:
我们在我们的世界中有5个数据库环境:开发,阶段,阿尔法,贝塔,生产。开发人员只对dev运行他们自己的脚本。他们负责将这些脚本签入源代码管理中,就像我们的其他源代码一样。我们有一个自动部署系统,它从源代码管理中检索这些脚本,并在每个后续环境中运行它们。
发布于 2015-08-18 13:57:35
正如您自己发现的那样,SQL是可行的,但是如果将SQL命令放入脚本中或将它们嵌入代码中,实际上并没有多大的区别。重要的是要使升级过程变得健壮。因此,我建议考虑以下改进
跟踪顺序sql或代码文件中的更改。
相反,跟踪您的更改(在sql和/或代码文件中),即使这些更改没有在原始序列中执行,或者当它们被执行两次时也能工作。让它们成为幂等的。在我们的一个系统中,我们为此使用了一个标志表,其中对数据库数据的每一次更改都标记了一个标志。升级数据库的伪代码如下所示
' part added by developer A during development of feature "Foo"
IF NOT CheckFlagTableIfUpgradeFooAlreadyApplied() THEN
IF ApplyUpgradeFoo() = SUCCESS THEN
MarkUpgradeFooInFlagTable()
COMMIT
ELSE
ROLLBACK
WriteToLog("UpgradeFooFailed")
END IF
END IF
' part added by developer B during development of feature "Bar"
IF NOT CheckFlagTableIfUpgradeBarAlreadyApplied() THEN
IF ApplyUpgradeBar() = SUCCESS THEN
MarkUpgradeBarInFlagTable()
COMMIT
ELSE
ROLLBACK
WriteToLog("UpgradeBarFailed")
END IF
END IF这样,您就可以始终使用一个旧数据库,并进行一些更改,而另一些则不应用,并将其升级到最新的状态。例如,当缺少更改"Foo“和"Bar”时,当只应用更改"Foo“,只应用更改"Bar”时,上述脚本将工作。通过这种方式添加后置条件也非常容易,以处理相互依赖的更新情况。模式更改可以类似地处理,但您甚至不需要为此设置一个标志表:只需实现像DoesColumnXYZExist()这样的测试方法,以验证某个特定列是否已经添加到模式中。
这使得当人们在不同时间将数据库更改集成到所有不同的开发数据库,以及对分阶段、测试或生产数据库进行并行工作时,变得更加容易和可靠。
还请参阅此前一个关于程序员的问题,其中提到了用于实现此过程的一个名为液基的工具。
https://softwareengineering.stackexchange.com/questions/293961
复制相似问题