【问题标题】:Play! framework - database issue with Evolutions玩!框架 - Evolutions 的数据库问题
【发布时间】:2012-08-20 19:46:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的帖子中有几个迹象表明您可能会做出一些危险/有问题的设计选择。根据列名,您似乎很有可能存储的是纯文本密码,而不是salted password hashes。这很糟糕,特别是如果您没有加密密码而是将其存储为纯文本。请 - 只是不要存储用户密码,使用身份验证服务和安全身份验证协议
  • 考虑使用 JSSEJava GSSJava SASL 来处理身份验证,并且不要在您的应用中存储密码 - 或者更好的是,使用 OAuth 或 OpenID,以便其他人可以管理给你的密码。您不想成为下一个必须告诉所有用户它正在存储纯文本无盐密码的破解站点;嘲讽刺痛。

标签: java playframework-2.0 web-development-server


【解决方案1】:

首先,您需要通过删除 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;

【讨论】:

  • 你能把你的答案切换到社区维基吗? :) 问题仍然存在,所以我们可以根据您的回答编写整个说明。
【解决方案2】:

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

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

【讨论】:

  • 好的,我在初读时或多或少地阅读并理解了。但是当您向数据库添加新字段但又不想丢失之前添加的所有记录时,应该采取什么正确的措施。当您处于生产阶段时,这个问题至关重要。
  • 哦,对了,我的错。我认为您应该做的是消除破坏性下降,并可能在您使用的地方添加一个 2.sql 和 ALTER sql 语句以向您的数据库添加一个字段。
  • 您可以禁用 down 部分,因为在生产中出现停机可能会有危险 - 在“play.evolutions.autoApplyDowns=false”的配置中
【解决方案3】:

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

【讨论】:

  • 我从未使用过 Play,所以我不能。查看 Liquibase 的网站了解更多信息,这是一个有据可查的项目。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多