Актуальная проблема при работе с PostgreSQL

Я использую slick в проекте 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, и мне нужно было удалить "" из имя таблицы, чтобы он работал.

Не могли бы вы рассказать мне, есть ли какая-либо опция slick, чтобы не включать "" в любой запрос при использовании имен таблиц?

Ответ 1

В конце концов я смог решить эту проблему.

Я указываю только имя таблицы:

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

и измените мой postgresql conf, чтобы включить мою схему при поиске (кажется, что пятно смотрит только на схему public):

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

и теперь он работает.

Ответ 2

Вы поместили схему в имя таблицы. A (указанное) имя таблицы, содержащее символ точки, действителен в SQL, но это не то, что вы хотите здесь. Вы должны указать схему отдельно:

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

Ответ 3

Решение, которое я нашел, когда вы хотите работать как с H2 (тестирование), так и с Postgres (производство) с использованием липибазы и пятна.

  • Придерживайтесь строчных букв в объектах Slick Table

класс MyTable (тег: тег) расширяет таблицу [MyRecord] (тег, Некоторые ( "my_schema" ), "my_table" )

  • В вашей конфигурации URL-адреса H2 вам необходимо указать DATABASE_TO_UPPER = false (это предотвращает верхнюю оболочку имен таблиц и столбцов) и помещает кавычки вокруг схемы INIT (это предотвращает верхнюю оболочку схемы)

url = JDBC: h2: мем: тест; MODE = PostgreSQL; DATABASE_TO_UPPER = ложь; INIT = создать схема, если не существует \ "my_schema \" \; SET SCHEMA\ "my_schema \" "

  • При указании имен схем в сценариях Liquibase он также должен быть указан так, чтобы H2 не пыталась его использовать.

Ответ 4

Поскольку эта проблема по-прежнему беспокоит новичков 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
}

Ответ 5

Вы используете неправильный драйвер, проверьте свои импортные ресурсы.

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