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

时间:2012-11-14 14:51:18

标签: postgresql scala slick

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

在使用表名时,是否可以告诉我在任何查询中是否有任何光滑的选项都不包含""

5 个答案:

答案 0 :(得分:6)

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

我只指定表名:

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

并更改我的postgresql conf以在搜索时包含我的架构(看起来光滑只在public架构上查看):

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

现在可行。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

  • 在Slick Table对象中坚持使用小写
  

class MyTable(tag:Tag)扩展Table [MyRecord](标签,   一些(&#34; my_schema&#34;),&#34; my_table&#34;)

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

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

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

答案 3 :(得分: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
}

答案 4 :(得分:-2)

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

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