如何在生产中处理Play Framework 2数据库演变
似乎每当我更改模型时,Play Framework都会要求我运行一个删除整个模式并重新创建它的脚本。 显然这不适用于生产,那么在生产中处理这个问题的正确方法是什么?
注意,我正在使用ebean和Postgres,并在heroku上托管。
不幸的是, Ebean
只能创建CREATE DDL
(而不是UPDATE DDL
)(正如他们的小组所回答的那样),因此您需要尽快切换到手动变换。
一些规则:
- 在实施任何更改之前始终备份您的实时数据库
- 如果ebean插件只有
1.sql
evolution,那么它将重新创建整个DDL - 您需要从
1.sql
删除两个第一个注释,然后开始编写自己的进化,并使用下一个数字2.sql
,3.sql
等。尝试在切换到手动进化之前放置尽可能多的模型/字段。 最重要的部分将由插件自动完成。 - 手动进化应包含现有表/列的
ALTERS
而不是DROP / CREATE,它们应该具有:每次更改的Ups
和Downs
。 - 尽量在每次进化中放置尽可能多的变化,然后更容易管理,然后为每个小变化编写单独的进化。
事实上有时候用DB gui修改数据库结构会更容易,无论如何它主要适用于单个开发人员…当你需要与其他开发人员共享代码时,编写演进将是更好的选择。
如果在一段时间后你将添加下一个“大”部分的新模型,你可以再次启用临时自动DDL并使用本地git来复制新部件。 然后恢复自己的革命并粘贴Ebean插件生成的新部件。
Biesior基本上总结得很好。 但是,作为Play的初学者,我发现通过具体示例进行更多澄清可能会有所帮助。
首先,以下示例适用于Java。
假设您添加了一个新字段
public String dum_str;
在你的模型Dum。 然后,你需要在conf/evolutions/
下的2.sql
conf/evolutions/
像这样:
# --- !Ups ALTER TABLE dum ADD COLUMN dum_str VARCHAR(255); # --- !Downs ALTER TABLE dum DROP dum_str;
我希望这会有所帮助。
备份为当前db的脚本。 在Java模型中进行更改。 让Play应用更改并重新创建数据库然后恢复数据。
Attn:不要更改现有的字段名,否则它将无效。