2015-12-23 32 views
1

我试图将一个List [String]插入到text []类型的postgresql列中。我相信当你尝试插入任何列表时,Anorm将列表的每个成员插入到它自己的列中。我很确定这是事实,因为我找回例外:玩Anorm插入scala列表到postgres文本数组列

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 

回答

1

为参数ANORM传递的价值观是不应该成为原始的JDBC值。你不应该通过java.sql.*值;你可以看看parameter mappings

然后,您传递的参数名称为Symbol,它已在Anorm 2.3中弃用,并且自2.4起不再支持。名字必须为String

SQL数组可以作为Array[T]传递,其中支持T作为参数类型。

您还可以查看关于multi-value parameters的文档。

+0

所以我使用.toArray解决了转换列表,但现在我得到“org.postgresql.util.PSQLException:找不到提供的名称VARCHAR的服务器数组类型”。它插入的列是文本[]。 – plambre

+0

当应该传递“varchar”时,是否通过某些类型转换“VARCHAR”? – plambre

+0

在这里你可以看到使用“VARCHAR”作为“sqlType”和jdbcType的模式https://github.com/playframework/anorm/blob/ce5e676ff0317eb3005156bd5717c768b9f8dc40/core/src/main/scala/anorm/ParameterMetaData.scala – plambre

0

,结束了对这一问题的工作代码为:

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例外非常神秘。