如何应对增量数据库架构演变

时间:2019-01-14 00:05:43

标签: scala playframework slick playframework-2.6 playframework-evolutions

我有一个Play框架驱动的应用程序,其中数据库作为持久层(为此我使用了Slick)。我启用了演进功能,生成了1.sql文件,并成功将其推出了生产环境。

客户端请求需要修改数据库架构的新功能-即。添加新表,添加新列以及更改现有列的可空性。

一旦更新了Slick的所有Table定义和相关代码,我将再次生成模式并将其放置为2.sql。正确要求运行Evolution,但是...生成的Evolution并不反映1.sql状态之上的增量更新,而是说明如何从头开始创建数据库模式的说明(即CREATE TABLE和所有列,包括新列)而不是“添加列”案例。

是否有可能实现增量更新,这样我就可以轻松地在生产环境中运行它以将数据库从版本1升级到版本2(#1和#2之间的SQL“ diff”),或者我必须手动进行创造那些进化?

2 个答案:

答案 0 :(得分:1)

在v1之后,您必须手动创建这些演变。

对于我们的产品,我们在产品进行装运前开发时保持“生成演变”的状态。准备好部署v1后,我们将关闭自动演进的生成,并从手动演进开始。

虽然这可能不是最佳选择,但作为一个团队,我们更愿意知道人类正在编码和检查DDL(有时是DML)SQL语句以进行演化,而不是使用自动化脚本来决定应该删除表并重新创建。在某些产品中,我们在持续改进和适应的过程中拥有数百年的evos。该系统运行良好。

答案 1 :(得分:0)

您只需要在演变脚本中放入差异即可。

示例

1.sql

CREATE TABLE Persons (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

2.sql

ALTER TABLE Persons ADD Email varchar(255);

现在,您的问题:

  

我再次生成模式并将其放置为2.sql

您再次生成了它,因此文件看起来像

1.sql

CREATE TABLE Persons (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);

2.sql

CREATE TABLE Persons (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
);
ALTER TABLE Persons ADD Email varchar(255);

您只需要将对方案的增量更改放入 2.sql ,就像在我的示例中一样。