【问题标题】:How one should handle incremental database schema evolution应该如何处理增量数据库模式演变
【发布时间】:2019-01-14 00:05:43
【问题描述】:

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

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

一旦所有 Slick 的表定义和相关代码都更新了,我会再次生成架构并将其放置为 2.sql。正确地请求运行演进,但是......生成的演进并不反映在 1.sql 状态之上的增量更新,而是说明如何从头开始创建数据库模式(即 CREATE TABLE 包含所有列,包括新列而不是而不是 ADD COLUMN 原因)。

是否有可能实现增量更新,以便我可以轻松地在生产中运行它以获取从修订 #1 到修订 #2 的数据库(#1 和 #2 之间的 SQL“差异”)或者我必须手动创造那些进化?

【问题讨论】:

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


    【解决方案1】:

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

    对于我们的产品,我们会在产品处于发货前开发阶段时启用“生成进化”。一旦 v1 准备好部署,我们关闭自动进化生成并开始手动进化。

    虽然这可能让人感觉不太理想,但作为一个团队,我们更愿意知道人类正在编码和审查 DDL(有时是 DML)SQL 语句以进行演进,而不是自动脚本决定可能应该删除一个表并重新创建。在某些产品中,我们有数百个 evos 跨越多年的持续改进和适应。该系统运行良好。

    【讨论】:

      【解决方案2】:

      您只需将差异放入进化脚本中。

      例子

      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 进行增量更改,就像在我的示例中一样。

      【讨论】:

      • 正确,尽管它没有回答问题 - 是否应该手动编写(可能通过区分 1.sql 和 2.sql 并创建一个 diff.sql 以手动应用于数据库)或有什么方法可以让它更加自动化/自动化(至少对于简单的场景)?
      猜你喜欢
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多