在播放框架anorm上将数组数据插入数据库

时间:2014-03-16 00:53:49

标签: sql arrays scala playframework-2.0 anorm

我需要将数组数据存储到数据库中。但我没有找到样品如何做到这一点。我尝试将数组视为普通数据类型,但似乎它不起作用。这是我的代码:

在数据库表中,我有3列:

Id integer,
uLocation integer,
Prices integer(366)

在SQL中,使用以下命令插入,更新或查询表:

def InseartToDatabase(ItemPrices: ListBuffer[Int], Id: Int, uLocation: Int) = {
     val prices = ItemPrices.toArray
     DB.withConnection { implicit c =>
         SQL("insert into task (Id, uLocation, Prices) values ({Id},{uLocation}, {Prices})").on('Id ->Id, 'uLocation->uLocation, 'Prices -> Prices).executeUpdate()
     }
}

这不能无声地工作,也没有异常报告。但下次更新失败了。如果我删除数组字段,上面的代码就可以了。

另外,我不知道如何查询它。

3 个答案:

答案 0 :(得分:1)

如果您正在使用H2,请尝试使用Postgresql模式。 Postgresql支持Array数据类型(ref)并从playframework 2.4.x开始,Anorm支持数组列解析器(ref),你可以像下面这样查询:

import anorm.SQL
import anorm.SqlParser.{ scalar, * }

// array and element parser
import anorm.Column.{ columnToArray, stringToArray }

val res: List[Array[String]] =
SQL("SELECT str_arr FROM tbl").as(scalar[Array[String]].*)

答案 1 :(得分:0)

您不会说出您正在使用的数据库。并非所有数据库都支持数组数据类型我有待纠正,但不要认为anorm支持您期望的阵列。 this google group's thread有一些讨论和潜在的解决方法。

P.S。允许我为多值列的单独表格插件。对于相对较小的不便,您可以获得标准的sql处理(更易于维护)和更好的跨平台代码,仅举几个好处。 :)

答案 2 :(得分:0)

使用.toSeq,而不是列表,这可能有用。

SQL("insert into task (Id, uLocation, Prices) values ({Id},{uLocation}, {Prices})").on('Id ->Id, 'uLocation->uLocation.toSeq, 'Prices -> Prices).executeUpdate()