【问题标题】:How to fix a MySQL syntax error when deploying a working Play application to CloudBees?将工作的 Play 应用程序部署到 CloudBees 时如何修复 MySQL 语法错误?
【发布时间】:2013-08-01 09:42:08
【问题描述】:

我有一个非常简单的 Play 应用程序,它说明了这里可用的 MySQL(而不是默认的 H2)数据库的使用:

https://github.com/ics-software-engineering/play-example-mysql

自述文件解释了使用本地安装的 MySQL 在本地运行应用程序所需的步骤。 在本地运行良好。

我一直试图让这个应用程序在 CloudBees 上运行,但没有成功。我的基本策略是:

  1. 使用 CloudBees Play 2 ClickStart 创建示例应用、数据库、存储库和构建系统。
  2. 编辑构建文件以引用我的 github 存储库。
  3. 重建和重新部署。

here 提供有关此策略的更完整说明。

当我完成这个过程时,系统构建和部署,但是当我尝试检索主页时,应用程序控制台中出现 MySQL 语法错误:

[ [37minfo [0m] play - database [default] connected at jdbc:mysql://ec2-23-21-211-172.compute-1.amazonaws.com:3306/play-example-mys
[ [31merror [0m] play - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sequence page_retrieval_seq' at line 1 [ERROR:1064, SQLSTATE:42000]
Oops, cannot start the server.
  @6f3k8cj6c: Database 'default' is in inconsistent state!
    at play.api.db.evolutions.Evolutions$.checkEvolutionsState(Evolutions.scala:177)

这是一个奇怪的错误,因为语法错误“sequence page_retrieval_seq”与数据库为默认(H2)时Play在1.sql中生成的一行非常相似:

create sequence page_retrieval_seq

不幸的是,这行实际上不在我的 1.sql 文件中,并且我在本地运行系统时没有收到此错误。我正在为 osx10.7 (x86_64) 运行 MySQL Ver 14.14 Distrib 5.6.12。

我认识到,对于生产用途,不建议启用自动进化,但这不是我想在这里解决的问题。我的目标是让 CloudBees 应用程序提供代码的最新工作版本的快照,并让进化在 CloudBees MySQL 上工作,就像它们在我的本地 MySQL 安装中工作一样。

我已经尝试了this answer 中列出的步骤,但它在 CloudBees 上不起作用,而且无论如何我当前的代码已经在本地安装的 MySQL 上正常工作。

为什么我的简单 Play 应用程序无法在 CloudBees 上正确部署,我该如何解决?

【问题讨论】:

  • 你能在本地用“play start”试试吗——只是想缩小mysql的版本。我看到它在本地工作,与cloudbees无关。

标签: mysql playframework-2.0 cloudbees


【解决方案1】:

在“生产模式”下运行播放时,当涉及 ebean 时,播放运行演变似乎存在问题

https://github.com/playframework/playframework/issues/1410

我已经测试了进化,只要不使用 ebean,它们甚至可以在生产模式下工作。

在任何情况下,在生产应用程序中运行进化都是不可取的,这可能就是为什么直到现在才发现这个错误。

我更新了文档:https://developer.cloudbees.com/bin/view/RUN/Playframework,提供了从任何地方连接到数据库的信息,因此您可以从桌面或 Jenkins 等运行进化。

因此,在更接近播放框架 prod 模式下运行“播放开始”以亲自查看此行为。

此外,JPA 似乎对 ORM 有更广泛的用途:https://github.com/typesafehub/play-spring-data-jpa

【讨论】:

    【解决方案2】:

    编辑:是的,我错了,看错了!

    =====================

    据我所知 MySQL 不支持序列。

    http://dev.mysql.com/doc/refman/5.6/en/faqs-general.html#qandaitem-B-1-1-6

    mysql> create sequence test;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sequence blag' at line 1
    

    【讨论】:

    • 同意,这就是问题的症状。我的问题是:为什么 CloudBees 部署会在(a)应用程序代码中的任何位置不存在“创建序列”,以及(b)在本地部署时不会发生该错误时导致该语法错误?
    • 嗯,我明白了,stackoverflow.com/questions/11233423/…也有类似的东西
    • 是的,我认为这个问题是由 Play 2.x 中的同一个错误产生的。基本上,虽然进化脚本(即 1.sql)具有正确的 MySQL 语法(包括使用 auto_increment),但 Play(或 EBean?)尝试调用 H2 特定的 SQL(创建序列)。我还尝试将 EBean 属性 datasource.default 设置为 mysql(请参阅avaje.org/ebean/getstarted_props.html#props),但这并没有阻止 Play 尝试执行创建序列命令。
    • 迈克尔做了一些很好的调查并提交了github.com/playframework/playframework/issues/1410
    • @PhilipJohnson 这似乎只在通过 play dist 运行时发生,播放开始 - 生产模式。播放运行似乎还可以(至少是 2.1.2)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多