11

我在 scala 项目中使用slick来查询一些表。

    //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 工具中运行它,我需要""表名中删除才能让它工作。

您能否告诉我""在使用表名时是否有任何不包含在任何查询中的巧妙选项?

4

5 回答 5

6

最后我能够解决这个问题。

我只指定表名:

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

并在搜索时更改我的 postgresql conf 以包含我的模式(似乎 slickpublic只在模式上查找):

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

现在它可以工作了。

于 2012-11-15T09:33:20.633 回答
5

您已将架构放入表名中。包含点字符的(带引号的)表名在 SQL 中是有效的,但这不是您想要的。您必须单独指定架构:

object Addresses extends Table[Address](Some("assetxs"), "address")
于 2012-11-14T15:21:10.520 回答
3

我想使用 liquibase 和 slick 同时使用 H2(测试)和 Postgres(生产)时找到的解决方案。

  • 在您的 Slick Table 对象中坚持使用小写字母

类 MyTable(tag: Tag) 扩展 Table[MyRecord](tag, Some("my_schema"), "my_table")

  • 在您的 H2 url 配置中,您需要指定 DATABASE_TO_UPPER=false (这可以防止表和列名被大写)并在 INIT 模式周围加上引号(这可以防止模式被大写)

url = jdbc:h2:mem:test;MODE=PostgreSQL;DATABASE_TO_UPPER=false;INIT=如果不存在则创建模式 \"my_schema\"\;SET SCHEMA \"my_schema\""

  • 在 liquibase 脚本中指定模式名称时,还必须引用它,以便 H2 不会尝试将其大写。
于 2015-06-25T01:22:43.863 回答
3

由于这个问题仍然困扰着 Scala 新手(比如我),我进行了一些小型研究,发现这样的问题application.conf在 Slick 3.1.1 和 PostgreSQL 9.5 上是成功的:

postgres.devenv = {
  url = "jdbc:postgresql://localhost:5432/dbname?currentSchema=customSchema"
  user = "user"
  password = "password"
  driver = org.postgresql.Driver
}
于 2016-09-08T22:46:03.227 回答
-2

您只是使用了错误的驱动程序,请检查您的导入

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

于 2012-11-14T17:43:29.747 回答