【问题标题】:play20 ebean generated sql throws syntax error on postgresqlplay20 ebean生成的sql在postgresql上抛出语法错误
【发布时间】:2012-09-04 13:45:58
【问题描述】:

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

基本上,我建立了与数据库的连接(因此从本地应用程序到 Heroku postgresql 数据库的连接有效),但我无法使用生成的 1.sql 演变来初始化数据库。但是由于 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查询有点错误。

有什么建议吗?

【问题讨论】:

    标签: sql heroku playframework-2.0


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢您先生! :) 重命名模型为我节省了很多工作量。
    • 谢谢!这非常烦人,因为我的模型中不再有用户,但进化从未更新。 play clean-all play 编译强制再生
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多