11

我正在使用播放!框架 2.0,我被困在一个涉及数据库的烦人问题上。

假设我有一个User(扩展Model)类,它的属性很少(、、、first_namelast_name)。 emailpassword

在某些时候,我想添加一个新属性,比如说last_ip(它是什么并不重要)。所以,我将属性添加到User类中,编译并运行。

问题是:我收到关于数据库更改的红色警报(显然),它要求我按“应用更改”(如果我没记错的话)。那很好但是!所有的数据库记录都被删除了

总之:我想要一个新字段,但我不想丢失我已经添加到数据库中的所有记录。这可能吗?

4

4 回答 4

18

First you need to disable automatic generation of Evolution files by deleting the first 2 commented lines of the conf/evolutions/default/1.sql:

# --- Created by Ebean DDL
# To stop Ebean DDL generation, remove this comment and start using Evolutions

# --- !Ups
...

Then, you need to create a second file, called conf/evolutions/default/2.sql containing your update on the database schema with an Ups and a Downs section:

# --- !Ups
ALTER TABLE USER ADD COLUMN last_ip varchar(30) DEFAULT NULL;

# --- !Downs

ALTER TABLE USER DELETE COLUMN last_ip;
于 2012-08-26T14:23:39.287 回答
4

你可能正在做的是应用破坏性进化。如果你查看 1.sql(或任何你的进化文件),在 DOWNS 下你有像“DROP DATABASE X”这样的语句。每当 Play 检测到进化文件中的更改时,它都会运行所有向下的进化,然后重新应用向上的进化,从而导致您的所有数据丢失。

这里有更多信息:http ://www.playframework.org/documentation/2.0.2/Evolutions

于 2012-08-25T15:04:58.893 回答
3

我建议你看看Liquibase。Liquibase 处理数据库更改,非常灵活并且独立于数据库。我在我的应用程序中使用它来确保当我应用数据库更改时不会删除任何东西。

于 2012-08-26T08:46:55.120 回答
2

您可以通过在 application.conf 中设置 evolutionplugin=disabled 来禁用 Evolutions

于 2014-07-03T23:52:41.637 回答