play20 ebean在postgresql上生成了sql throws语法错误

时间:2012-09-03 22:47:44

标签: sql heroku playframework-2.0

我正在尝试使用postgresql来运行我的play20应用程序,以便我可以使用并稍后部署到Heroku。我遵循了answer

基本上,我连接到数据库(所以从本地应用程序连接到Heroku postgresql数据库工作),但我无法使用生成的1.sql evolution初始化数据库。但是由于postgresql正在使用schema,所以生成的sql无法正常工作(无论如何它应该没有架构,但显然我做错了或数据库做错了)。

create table user (
id                        bigint not null,
email                     varchar(255),
gender                    varchar(1),
constraint pk_user primary key (id));

导致

ERROR: syntax error at or near "user"
  Position: 14 [ERROR:0, SQLSTATE:42601]

我通过向表名添加模式

来解决这个问题
create table public.user(
  ...
);

好的,一切正常,直到我尝试读取或写入数据库。我再次获得sql语法异常,无法使用数据库。好像sql查询有点不对。

任何可能存在问题的建议?

2 个答案:

答案 0 :(得分:8)

在使用其他数据库而不是在生产中开发应用程序时,这是一个非常常见的错误,但幸运的是,这也是常见的解决方案。您仍然可以使用User模型,但是您必须确保创建具有更改名称的数据库表:

@Entity
@Table(name = "users")
public class User extends Model {
    ...
}

在大多数情况下,在控制器和型号中,名称 - 开关对您来说是透明的。只有您必须记住切换的位置才是RawSql个查询。

顺便说一下,最好在本地安装相同的数据库进行开发,因为大多数流行数据库之间存在很多差异,比如其他保留关键字,其他允许类型,甚至其他自动递增方法,因此找到并修复正确的值在localhost上更容易。

答案 1 :(得分:2)

好吧,由于我对postgresql的了解不多,我整天都在苦苦思索。这是简单的解决方案。不要在postgreqsl上使用名为“user”的表。此表已被使用。

但为什么我的evolution sql查询适用于初始化数据库?好吧,如果我明确指定我想在哪个模式中创建表“user”,那基本上可行。

但是如果未指定schema,则使用当前架构。来自documentation

  

如果给出了模式名称(例如,CREATE TABLE myschema.mytable ...),则表格将在指定的模式中创建。否则,它将在当前架构中创建

所以这就解释了。但对于我的项目,使用“用户”模型是完全合理的,对于基于H2文件的数据库,它是有效的,所以我认为问题是在其他地方......