我正在尝试将List [String]插入text []类型的postgresql列中。我相信当您尝试插入任何List时,Anorm会将List的每个成员插入其自己的列中。我很确定这是因为我回到了例外:
org.postgresql.util.PSQLException: ERROR: INSERT has more expressions than target columns
我想要做的是将整个List作为文本[]插入。我目前的代码:
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
答案 0 :(得分:1)
作为参数传递给Anorm的值不应该是原始JDBC值。你不应该传递java.sql.*
值;您可以查看parameter mappings。
然后,您将参数名称传递为Symbol
,这已在Anorm 2.3中弃用,并且自2.4以来不再受支持。名称必须以String
传递。
SQL数组可以Array[T]
传递,支持T
作为参数类型。
您还可以查看有关multi-value parameters。
的文档答案 1 :(得分:1)
最终解决此问题的代码是:
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)
}
}
从原帖中改变的是使用Anorm字符串插值SQL" ..."以及在多值参数周围添加ARRAY[...]
。我不完全确定为什么这有效,因为postgres例外是非常神秘的。