2012-11-14 25 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) 
} 

私は気づい

もちろん(私はPostgreSQLのツールでそれを実行しようとしたと私はを削除するために必要な動作しません
select x2."id", x2."street", x2."number", x2."zipcode", x2."country" 
from "assetxs.address" x2 

:にschema.tableの名前はとても文がある""に表示されます。テーブル名から作業してください。

テーブル名を使用しているときにすべてのクエリに""を含めないようにすっきりとしたオプションがある場合は教えてください。

+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](Some("assetxs"), "address") 
+0

回避策を見つけてくれてありがとう、と感謝しています:-)これを試したことがありますか:jdbc:postgresql:// localhost:5432/yourdatabase?searchpath = assetxs – Jack

+0

@JacobusRはい。しかし、なぜ動作しないのかわかりません... –

4

スキーマをテーブル名に入れました。ドット文字を含む(引用された)テーブル名はSQLでは有効ですが、ここでは必要ではありません。最後に、あなたの輸入

輸入scala.slick.driver.PostgresDriver.simple._

+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

あなただけの間違ったドライバを使用している:あなたは個別にスキーマを指定する必要があります私はこの問題を解決することができました。

私は、テーブル名を指定します

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

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

をして検索するときに、私のスキーマを含めるために私のPostgreSQL CONFを変更する(その滑らかなだけpublicスキーマに見ているようです)

これが機能します。

+0

私は既にあなたが指定したインポートを使用しています: 'import scala.slick.driver.PostgresDriver.simple._' –

3

私が見つけた解決策は、liquibaseとslickを使ってH2(テスト)とPostgres(プロダクション)の両方で作業したいときでした。あなたのスリック表中の小文字と

  • スティックは、あなたのH2のURLの設定では

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

  • オブジェクト次のように指定する必要がありますDATABASE_TO_UPPER =(これは、上であることから、テーブル名とカラム名を防ぐ偽INITスキーマの前後に引用符を入れます(これにより、スキーマが大文字になることはありません)。
  • liquibaseスクリプトでスキーマ名を指定するときは、H2が大文字化しようとしないように引用符で囲む必要があります。
2

この問題はまだ(私のような)Scalaの新規参入者を悩ませているので、私は小さな研究を行い、そのよう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 
} 
関連する問題