2

我想实现仅在 Scala Play 框架应用程序满足条件时才适用的演变。条件是应用程序应该在一定的环境中。

我现在有这个进化:

# payments SCHEMA

# --- !Ups

INSERT INTO table1 (id, provider_name, provider_country, provider_code, status, flag)
VALUES (10, 'XXXXX', 'XX', 'XXXXX', '1', '0');

# --- !Downs
DELETE FROM table2
WHERE id = 10;

如果满足此条件,我希望进化运行

if(config.env == 'dev'){
   //execute evolution
}

我如何实现这一目标?这是进化的功能还是应用程序逻辑?

4

2 回答 2

0

为什么你需要它?您不按照文档中的说明对不同的环境使用单独的数据库吗?如果你这样做 - 那么你可能有不同的数据库配置,可能在不同的文件中。这可能看起来像这样:

# application.conf
db.default {
    driver=com.mysql.jdbc.Driver
    url="jdbc:mysql://localhost/playdb"
    username=playdbuser
    password="a strong password"
}
# dev.conf
db.dev {
    driver=com.mysql.jdbc.Driver
    url="jdbc:mysql://localhost/playdb"
    username=playdbuser
    password="a strong password"
}
# staging.conf
db.staging {
    driver=com.mysql.jdbc.Driver
    url="jdbc:mysql://localhost/playdb"
    username=playdbuser
    password="a strong password"
}
# prod.conf
db.prod {
    driver=com.mysql.jdbc.Driver
    url="jdbc:mysql://localhost/playdb"
    username=playdbuser
    password="a strong password"
}

实际上没有什么能阻止你让它成为相同的数据库,但不要 -只需在每个环境中使用适当的数据库。假设您正在使用 jdbc 连接器和 PlayEvolutions 插件 - 只需将您的进化放到正确的目录中,您就会实现您想要的。另一个问题实际上是:“如何在每个环境中使用适当的数据库?” 答案很大程度上取决于您对 DI 的选择。

于 2018-05-19T16:10:49.343 回答
0

一种方法可能是将存储过程与基于数据库的应用程序“设置”结合使用。假设您的应用有一个用于存储应用设置的 appSetting 表。

create table appSetting (
  name varchar(63) not null primary key, 
  value varchar(255)
) ;
-- insert into appSetting values ('environment','dev');

然后,仅当 appSetting 在运行演变时设置“环境”的值为“开发”时,以下几行的内容才会创建一个 tmpLog 表(或将一个值插入表 1):

# --- !Ups
create procedure doEvolution31()
  begin
    declare environment varchar(31);;
    select value
      into environment
      from appSetting
    where name='environment'
    ;;
    if (environment='dev') then
      create table tmpLog (id int not null primary key, text varchar(255));;
      -- or INSERT INTO table1 (id, provider_name, provider_country, provider_code, status, flag) VALUES (10, 'XXXXX', 'XX', 'XXXXX', '1', '0');
    end if;;
  end
;
call doEvolution31();

# --- !Downs
drop procedure doEvolution31;
drop table if exists tmpLog;
-- or delete from table2 where id=10;

你没有提到你正在使用哪个数据库。以上是MYSQL语法。可能有一种方法可以将配置值放入存储的过程中,也许是通过一些 sbt 魔术,但我认为如果我们有这样的要求,我们会使用上面的方法。(顺便说一句,双分号用于转义单个分号,以便在创建过程时不执行过程的各个语句。)

于 2018-05-19T15:08:25.297 回答