2012-11-14 59 views
11

我在一個scala項目中使用slick來查詢一些表。與PostgreSQL一起使用時出現問題

//define table 
object Addresses extends Table[Address]("assetxs.address") { 
    def id = column[Int]("id", O.PrimaryKey) 
    def street = column[String]("street") 
    def number = column[String]("number") 
    def zipcode = column[String]("zipcode") 
    def country = column[String]("country") 
    def * = id ~ street ~ number ~ zipcode ~ country <> (Address, Address.unapply _) 
} 

如果我用這個表不工作的任何查詢(它說,它無法找到我的表),所以我還和打印出去的查詢,如:

implicit val session = Database.forURL("jdbc:postgresql://localhost:5432/postgres", driver = "org.postgresql.Driver", user="postgres", password="postgres").createSession() 
     session.withTransaction{ 
     val query = Query(Addresses) 
     println("Addresses: " + query.selectStatement) 
} 

我注意到,該schema.table的名字出現在""這樣的說法是:

select x2."id", x2."street", x2."number", x2."zipcode", x2."country" 
from "assetxs.address" x2 

這當然不工作(我試圖在PostgreSQL的工具運行它,我需要刪除""表名爲了讓它工作。

請問在使用表名時,是否有任何的查詢選項不包含""

+1

你確定這是你遇到的問題?在PostgreSQL中,未加引號的標識符會轉換爲小寫,在您的示例中,刪除引號會導致相同的查詢。 –

+0

@AntsAasma,我確定「assetxs.address」是一個令人頭痛的問題。 –

+0

http://stackoverflow.com/questions/6720626/how-do-i-specify-a-postgresql-schema-in-scalaquery –

回答

6

到底我能解決這個問題。

我只指定表名:

object Addresses extends Table[Address]("address")

和改變我的PostgreSQL的conf,包括我的模式搜索時(似乎華而不實正在尋找只public模式):

search_path = '"$user",assetxs,public'

現在它工作。

+0

很高興看到您找到了解決方法,並感謝您分享:-)您是否嘗試過:jdbc:postgresql:// localhost:5432/yourdatabase?searchpath = assetxs – Jack

+0

@JacobusR是的,但我不明白爲什麼它不起作用... –

4

您已將架構放入表名中。包含點字符的(引用的)表名在SQL中是有效的,但這不是您想要的。您必須指定單獨的模式:

object Addresses extends Table[Address](Some("assetxs"), "address") 
+1

謝謝,但似乎以這種方式模式不再包含在sql語句中:'SQL語句:select x2。「id」,x2。「street」,x2。「number」 ,x2。「zipcode」,x2。「count ry」from「address」x2' –

+0

@CristianBoariu如果我沒有弄錯,你可以指定模式作爲數據庫URL的一部分,但我無法測試這個權利現在。 – Jack

+0

@JacobusR我已經嘗試過,就像'url?schema = assetx',但它仍然不起作用... –

-2

你只是使用了錯誤的驅動程序,請檢查您的進口

進口scala.slick.driver.PostgresDriver.simple._

+0

我已經使用您指定的導入:'import scala.slick.driver.PostgresDriver.simple._' –

3

當我想要使用liquibase和slick工作在H2(測試)和Postgres(生產)時,我發現了這個解決方案。

  • 堅持以小寫在油滑的表對象

class MyTable(tag: Tag) extends Table[MyRecord](tag, Some("my_schema"), "my_table")

  • 在您H2網址的配置,你需要指定DATABASE_TO_UPPER = FALSE(這可防止表和列名被上套管),並把周圍的INIT模式引號(這可防止模式被上套管)

url = jdbc:h2:mem:test;MODE=PostgreSQL;DATABASE_TO_UPPER=false;INIT=create schema if not exists \"my_schema\"\;SET SCHEMA \"my_schema\""

  • 在liquibase腳本中指定模式名稱時,還必須引用它,以便H2不會嘗試使其大寫。
2

因爲這個問題仍然困擾着斯卡拉新人(像我),我已經進行小調查,發現了這樣一個application.conf是成功的油滑3.1.1和PostgreSQL 9.5:

postgres.devenv = { 
    url = "jdbc:postgresql://localhost:5432/dbname?currentSchema=customSchema" 
    user = "user" 
    password = "password" 
    driver = org.postgresql.Driver 
} 
相關問題