问题 与PostgreSQL一起使用时的光滑问题


我在用着 华而不实的 在scala项目中查询一些表。

    //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工具中运行它,我需要删除 "" 从 表名 为了使它工作。

如果有任何光滑的选项不包括在内,你能告诉我吗? "" 在使用表名时的任何查询?


12802
2017-11-14 14:51


起源

你确定这是你遇到的问题吗?在PostgreSQL中,不带引号的标识符将转换为小写,在您的示例中,删除引号将导致相同的查询。 - Ants Aasma
@AntsAasma,我确信“assetxs.address”是令人头疼的问题。 - Michael Krelin - hacker
stackoverflow.com/questions/6720626/... - Michael Krelin - hacker
如果您尝试在PostgreSQL工具UI中运行此查询,它将无法正常工作。所以什么光滑打印它是不正确的...如果我尝试从scla / slick运行查询,它告诉我: ERROR: relation "assetxs.address" does not exist - Cristian Boariu
@ MichaelKrelin-hacker如果我没有在那里指定架构,它会告诉我 ERROR: relation "address" does not exist - Cristian Boariu


答案:


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

我只指定表名:

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

并在搜索时更改我的postgresql conf以包含我的架构(似乎光滑正在查看 public 仅架构):

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

现在它的工作原理。


6
2017-11-15 09:33



很高兴看到你找到了一个解决方法,并感谢分享:-)你试过这个:jdbc:postgresql:// localhost:5432 / yourdatabase?searchpath = assetxs - Jack
@JacobusR是的,但我不明白为什么它不起作用...... - Cristian Boariu


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

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

4
2017-11-14 15:21



谢谢,但似乎这样的架构不再包含在sql语句中: SQL statement: select x2."id", x2."street", x2."number", x2."zipcode", x2."count ry" from "address" x2 - Cristian Boariu
@CristianBoariu如果我没有误会,你可以指定架构作为数据库URL的一部分,但我现在无法测试。 - Jack
@JacobusR我也尝试过这样 url?schema=assetx 但它仍然不起作用...... - Cristian Boariu
我发现这两个帖子可能会有所帮助: stackoverflow.com/a/4820666/828757 和 stackoverflow.com/a/4185710/828757。您所指的问题也是ScalaQuery的一个问题,但不幸的是问题链接已被破坏,因此我们不知道它是否已修复: stackoverflow.com/questions/6720626/... - Jack
原始问题的新工作链接是 github.com/slick/slick/issues/19。忽略表定义中的模式名称这一事实是一个错误: github.com/slick/slick/issues/8。 - szeiger


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

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

class MyTable(tag:Tag)扩展Table [MyRecord](标签,   一些(“my_schema”),“my_table”)

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

url =   JDBC:H2:MEM:测试; MODE = PostgreSQL的; DATABASE_TO_UPPER = FALSE; INIT =创建   架构如果不存在\“my_schema \”\; SET SCHEMA \“my_schema \”“

  • 在liquibase脚本中指定模式名称时,还必须引用它,以便H2不会尝试将其大写。

3
2018-06-25 01:22





由于这个问题仍然困扰着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
}

2
2017-09-08 22:46





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

import scala.slick.driver.PostgresDriver.simple._


-2
2017-11-14 17:43



我已经使用你指定的导入: import scala.slick.driver.PostgresDriver.simple._ - Cristian Boariu