5

我正在尝试使用 postgresql 使用我的 play20 应用程序,以便我可以使用并稍后部署到 Heroku。我跟着这个答案

基本上,我建立了与数据库的连接(因此从本地应用程序到 Heroku postgresql 数据库的连接有效),但我无法使用生成的 1.sql 演变来初始化数据库。但是生成的 sql 无法工作,因为 postgresql 正在使用模式(无论如何它应该在没有模式的情况下工作,但显然我做错了什么或数据库做错了什么)。

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 查询在某种程度上是错误的。

有什么建议可能有问题吗?

4

2 回答 2

8

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

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

在大多数情况下,在您的控制器和模型中,名称切换对您来说是透明的。唯一需要记住开关的地方是RawSql查询。

顺便说一句,在本地安装相同的数据库以进行开发是个好主意,因为大多数流行的数据库之间存在很多差异,例如其他保留关键字,其他允许的类型,甚至其他 id 的自动递增方法,因此查找和修复正确的值更容易在本地主机上。

于 2012-09-04T05:45:58.023 回答
2

好吧,由于我对postgresql知之甚少,我整天都在为此苦苦挣扎。这是简单的解决方案。不要在 postgreqsl 上使用名为“user”的表。该表已被使用。

但是为什么我的进化 sql 查询对数据库的初始化起作用?好吧,如果我明确指定要在哪个模式中创建表“用户”,那基本上可以工作。

但如果未指定架构,则使用当前架构。从文档

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

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

于 2012-09-03T23:15:59.330 回答