我正在尝试使用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查询有点不对。
任何可能存在问题的建议?
答案 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文件的数据库,它是有效的,所以我认为问题是在其他地方......