Play framework 2.0.1 不断尝试进化错误的数据库类型

Posted

技术标签:

【中文标题】Play framework 2.0.1 不断尝试进化错误的数据库类型【英文标题】:Play framework 2.0.1 keeps trying to evolve wrong database type 【发布时间】:2012-06-27 19:15:20 【问题描述】:

我正在开发部署在 openshift DIY 应用程序上的 play 2.0.1 应用程序。 我在使用数据库时遇到了麻烦,因为 play 一直在尝试发展错误的数据库。我有一个 mysql 数据库,并且 play 创建了一个 H2 数据库进化脚本。 这是脚本。

他想创造什么

create table gif (
id                        bigint not null,
title                     varchar(255),
add_date                  timestamp,
gif_url                   varchar(255),
img_source                varchar(5000),
web_id                    varchar(255),
found_on                  varchar(255),
thumbnail                 varchar(255),
version                   integer not null,
constraint pk_gif primary key (id))
;

create table task (
id                        bigint not null,
action                    varchar(255),
queue                     integer,
type                      varchar(255),
object_id                 bigint,
params                    varchar(255),
working_on                boolean,
version                   integer not null,
constraint pk_task primary key (id))
;

create sequence gif_seq;

create sequence task_seq; 

它应该创造什么

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

# --- !Ups

create table gif (
  id                        bigint auto_increment not null,
  title                     varchar(255),
  add_date                  datetime,
  gif_url                   varchar(255),
  img_source                varchar(5000),
  web_id                    varchar(255),
  found_on                  varchar(255),
  thumbnail                 varchar(255),
  version                   integer not null,
  constraint pk_gif primary key (id))
;

create table task (
  id                        bigint auto_increment not null,
  action                    varchar(255),
  queue                     integer,
  type                      varchar(255),
  object_id                 bigint,
  params                    varchar(255),
  working_on                tinyint(1) default 0,
  version                   integer not null,
  constraint pk_task primary key (id))
;

我的应用程序.conf

# This is the main configuration file for the application running on openshift.
# ~~~~~

include "application"

# Secret key
# ~~~~~
# The secret key is used to secure cryptographics functions.
# If you deploy your application to several instances be sure to use the same key!
application.secret="TsLWj4[^1N<7lkdhfaiusjdpoifnsaodfEkyPDTO[dnh<7_R[j;cN0:lGK6Mm`0048C@3PK]4KR6HobL"

# Openshift database configuration
# ~~~~~
# You can declare as many datasources as you want.
# By convention, the default datasource is named `default`
#
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://"$OPENSHIFT_DB_HOST":"$OPENSHIFT_DB_PORT/$OPENSHIFT_APP_NAME
db.default.user=$OPENSHIFT_DB_USERNAME
db.default.password=$OPENSHIFT_DB_PASSWORD

#db.default.driver=org.h2.Driver
#db.default.url="jdbc:h2:mem:play"
#db.default.user=sa
#db.default.password=""
#
# You can expose this datasource via JNDI if needed (Useful for JPA)
# db.default.jndiName=DefaultDS


ebean.default= "models.*"

#Akka
akka.default-dispatcher.fork-join-executor.pool-size-max = 64
akka.actor.debug.receive = on
# Logger
# ~~~~~
# You can also configure logback (http://logback.qos.ch/), by providing a logger.xml file in the conf directory .

# Root logger:
logger.root=ERROR

# Logger used by the framework:
logger.play=INFO

# Logger provided to your application:
logger.application=DEBUG

# openshift action_hooks scripts configuration
# ~~~~~
openshift.play.params="-DapplyEvolutions.default=true"

我用这段代码执行它:

目标/开始\ -Dhttp.port=8080\ -Dhttp.address=$OPENSHIFT_INTERNAL_IP \ -Dconfig.resource=openshift.conf

【问题讨论】:

所以区别只是auto_increment 使用/未用于primary key?这并不特定于 MySQL 或 H2(两个数据库都支持)。 问题是 MySQL 不支持“创建序列”,因此当游戏尝试进化数据库时它“崩溃” 你的mysql进化文件的名称和路径是什么? play 在 conf/evolutions/default/1.sql 中创建它们 【参考方案1】:

我注意到您application.conf 中的 MySQL 环境变量不正确。正确的 MySQL 环境变量名称是:

OPENSHIFT_MYSQL_DB_HOST
OPENSHIFT_MYSQL_DB_PORT
OPENSHIFT_MYSQL_DB_USERNAME
OPENSHIFT_MYSQL_DB_PASSWORD

虽然我无法测试您的配置以查看此更改是否解决了您的问题,但不正确的变量名称似乎值得指出。

【讨论】:

【参考方案2】:

我打开了这个问题 - 因为这似乎只有在“生产”模式下尝试使用进化运行时才会发生(例如,通过播放开始):

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

我从我的桌面上看到了这个 - 与任何云提供商无关。

【讨论】:

【参考方案3】:

我刚刚在自己的项目中遇到了同样的问题,我想我知道发生了什么。 我正在使用 ANT 来构建我的项目。仅当我在“播放开始”之前运行单元测试时才会出现此问题。

在我的单元测试代码中,我使用 H2DB 对其进行测试。 结果,play 吐出了 H2 语法的 1.sql,它替换了为 mysql 数据库创建的原始 1.sql。运行测试后,play看到1.sql已经存在,所以它不会费心生成另一个并使用为H2DB生成的那个并且出现错误。 我的解决方案是在我的 Ant 脚本中运行单元测试后删除 1.sql。 希望这可以帮助。

【讨论】:

以上是关于Play framework 2.0.1 不断尝试进化错误的数据库类型的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework:如何不查看文件夹以了解 Play Framework 中的更改

数据库“默认”需要进化!尝试使用 play framework 2.7.0 和 Ebean 连接到 MySQL 时

Play Framework 无法连接到 WS

模板的 Play Framework 自定义 java 扩展

Play framework 2.0 尝试级联删除时出错“参数“#1”未设置;SQL语句:delete”

安装 Play Framework 1.2.7 时出现问题