Play Anorm вставляет список scala в столбец текстового массива postgres
Я пытаюсь вставить List[String] в столбец postgresql типа text[]. Я полагаю, что когда вы пытаетесь вставить какой-либо список, Anorm вставляет каждого члена списка в свой собственный столбец. Я уверен, что это так, потому что я получаю исключение:
org.postgresql.util.PSQLException: ERROR: INSERT has more expressions than target columns
Что я хочу сделать, это вставить весь список в виде текста []. Мой текущий код:
def insertList(listName: String, subLists: List[String]): Long = {
DB.withConnection{implicit c =>
SQL(
"""
INSERT INTO mailinglists(name, sublists) VALUES({listName}, {subLists})
""")
.on('listName -> listName, 'subLists -> subLists)
.executeInsert(scalar[Long] single)
}
}
Я пытался пойти по этому пути:
ConnectionPool.borrow().createArrayOf("text", subLists.toArray)
Но я получаю ошибку:
type mismatch;
found : (Symbol, java.sql.Array)
required: anorm.NamedParameter
2 ответа
Код, который закончил работать для этой проблемы:
def insertList(listName: String, subLists: List[String]): Long = {
DB.withConnection{implicit c =>
SQL"INSERT INTO mailinglists(name, sublists) VALUES($listName, ARRAY[$subLists])"
.executeInsert(scalar[Long] single)
}
}
Что изменилось по сравнению с оригинальным постом, так это использование SQL-строки с интерполяцией Anorm "..." и добавление ARRAY[...]
вокруг многозначного параметра. Я не совсем уверен, почему это сработало, поскольку исключения postgres были очень загадочными.
Значения, передаваемые в качестве параметров в Anorm, не должны быть необработанными значениями JDBC. Вы не должны проходить java.sql.*
ценности; Вы можете взглянуть на сопоставления параметров.
Затем вы передаете имена параметров как Symbol
, которая устарела в Anorm 2.3 и больше не поддерживается с 2.4. Имена должны быть переданы как String
,
Массив SQL может быть передан как Array[T]
, с T
поддерживается как тип параметра.
Вы также можете посмотреть документацию о многозначных параметрах.