我正在玩Play!框架2.0,我陷入了涉及数据库的恼人问题。
假设我有User
(扩展Model
)类,其属性很少(first_name
,last_name
,email
,password
等)。
在某些时候我想添加一个新属性,比方说last_ip
(这并不重要)。所以,我将属性添加到User
类,编译并运行。
问题是:我得到关于数据库更改的明确警告(显然),要求我按“应用更改”(如果我没记错的话)。那很好但是! 删除所有数据库记录!
总之:我想要一个新领域,但我不想丢失已添加到数据库中的所有记录。这可能吗?
答案 0 :(得分:18)
首先,您需要通过删除conf/evolutions/default/1.sql
的前2个注释行来禁用Evolution文件的自动生成:
# --- Created by Ebean DDL
# To stop Ebean DDL generation, remove this comment and start using Evolutions
# --- !Ups
...
然后,您需要创建第二个文件,名为conf/evolutions/default/2.sql
,其中包含有关Ups和Downs部分的数据库架构的更新:
# --- !Ups
ALTER TABLE USER ADD COLUMN last_ip varchar(30) DEFAULT NULL;
# --- !Downs
ALTER TABLE USER DELETE COLUMN last_ip;
答案 1 :(得分:4)
你可能正在做的是应用破坏性的演变。如果你查看1.sql(或你的evolutions文件),在DOWNS下你有像“DROP DATABASE X”这样的statemtnts。每当Play检测到进化文件中的更改时,它都会运行所有向下演变,然后重新应用向上演变,从而导致所有数据丢失。
以下是更多信息:http://www.playframework.org/documentation/2.0.2/Evolutions
答案 2 :(得分:3)
我建议你看看Liquibase。 Liquibase处理数据库更改,超级灵活且与数据库无关。我在我的应用程序中使用它来确保在应用数据库更改时不会删除任何内容或其他内容。
答案 3 :(得分:2)
您可以通过在application.conf
中设置evolutionplugin = disabled来禁用Evolutions