2016-08-30 61 views
0

我不確定是否我的問題連接到Scala Play 2.5.x Framework或PostgreSQL,所以我將描述我的設置。如何在使用PostgreSQL的Scala Play項目中使'公共'模式默認?

我使用Play 2.5.6與Scala和PostgreSQL 9.5.4-2從BigSQL Sandboxes。我使用Play Framework默認演變包來管理數據庫版本。

我在BigSQL Sandbox的PGSQL和PGSQL中創建了一個新數據庫,創建了一個名爲public的默認模式。我使用這個模式進行開發。

我想創建一個表與下面的腳本(1.sql在DB進化配置):

# 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 (...);不會引發錯誤)

我試過如下:

  1. 我設置search_path爲我的用戶:ALTER USER my_user SET search_path to public;
  2. 我設置search_path我的數據庫:ALTER database "my_database" SET search_path TO my_schema;
  3. search_path正確顯示此:"$user",public

我得到了以下錯誤:

  1. 在玩:p.a.d.e.DefaultEvolutionsApi - ERROR: syntax error at or near "user"
  2. 在pgAdmin的:

    錯誤:在語法錯誤或接近 「用戶」

    行1:CREATE TABLE用戶(

    ********** Error **********

    錯誤:在語法錯誤或接近 「用戶」

    SQL狀態:42601

    字符:14

回答

2

這有什麼好做的默認模式。 user是保留字。

您需要使用雙引號能夠創建這樣一個表:

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

但我強烈不建議這樣做。找到一個不需要引用標識符的不同名稱。

+0

這是解決方案,謝謝!我覺得這個錯誤信息在這種情況下並不真正有用。順便說一下,我做了一個簡短的研究,看看爲什麼我沒有在Google上發現它。我應該搜索階段「創建表用戶」。這樣我可以找到你的其他答案:http://stackoverflow.com/questions/22256124/cannot-create-a-database-table-named-user-in-postgresql :)我去了「user_account」的名稱。 –

相關問題