Актуальная проблема при работе с 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._