如何使公众'使用PostgreSQL的Scala Play项目中的架构默认值?

时间:2016-08-30 18:58:35

标签: database postgresql scala playframework

我不确定我的问题是连接到Scala Play 2.5.x Framework还是PostgreSQL,所以我将描述我的设置。

我正在使用来自BigSQL Sandboxes的Play 2.5.6与Scala和PostgreSQL 9.5.4-2。我使用Play Framework默认进化包来管理数据库版本。

我在BigSQL Sandbox中创建了一个新数据库,PGSQL和PGSQL创建了一个名为public的默认模式。我使用这个模式进行开发。

我想创建一个包含以下脚本的表(在DB evolution config中为1.sql):

# Initialize the database

# --- !Ups

CREATE TABLE user (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT NOT NULL,
    creation_date TIMESTAMP NOT NULL
);

# --- !Downs

DROP TABLE user;

除此之外,我想用这样的代码阅读表格:

val resultSet = statement.executeQuery("SELECT id, name, email FROM public.user WHERE id=" + id.toString)

如果我想执行任何提到的代码,或者即使我在pgadmin中使用CREATE TABLE...代码,我也会收到错误。问题在于user表名。如果我用public作为前缀(即public.user),一切正常。

我的问题是:

  1. 每次都使用模式名称为表名添加前缀是否正常?这对我来说似乎很奇怪。
  2. 如何将public架构设为默认选项,以便我不必限定表名? (例如CREATE TABLE user (...);不会抛出错误)
  3. 我尝试了以下内容:

    1. 我为我的用户设置了search_pathALTER USER my_user SET search_path to public;
    2. 我为我的数据库设置search_pathALTER database "my_database" SET search_path TO my_schema;
    3. search_path正确地显示了这一点:"$user",public
    4. 我收到了以下错误:

      1. 在游戏中:p.a.d.e.DefaultEvolutionsApi - ERROR: syntax error at or near "user"
      2. 在pgadmin:

        错误:用户"

        处或附近的语法错误

        第1行:CREATE TABLE用户(

        **********错误**********

        错误:用户"

        处或附近的语法错误

        SQL状态:42601

        字符:14

1 个答案:

答案 0 :(得分:2)

这与默认架构无关。 user是保留字。

您需要使用双引号才能创建此类表:

CREATE TABLE "user" (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT NOT NULL,
    creation_date TIMESTAMP NOT NULL
);

但我强烈建议不这样做。查找不需要带引号的标识符的其他名称。