【问题标题】:Getting one value to a val in Scala out of SQL database从 SQL 数据库中获取一个值到 Scala 中的 val
【发布时间】:2014-03-14 11:33:15
【问题描述】:

我正在使用带有 postgreSQL 的 play 框架,并试图从表中的特定行和列中只获取一个值。 该程序编译代码没有问题,但是当调用带有此代码的操作时,它就不起作用了。 SQL查询工作正常,我在psql中检查过。

DB.withConnection { implicit connection =>
    val selectSalt: Option[String] = SQL("""
    select salt from devices
    where principal_id=(
              select id from principals 
              where principal={id})
    """).on(
    'id -> user).as(scalar[String].singleOpt)

...(下面还有更多代码)

【问题讨论】:

  • 您是否有可能返回多行而不仅仅是 1 行?我认为用户是 Int 还是 Long 来匹配 id?正如其他人所问的那样,您收到的确切错误是什么?
  • 我发现我试图获取的值是空的,我填写了它并且代码有效。但是为什么它在 null 时不起作用?
  • 如果值为空,selectSalt 应该包含一个None。不知道为什么它没有执行你的 println。

标签: sql database postgresql scala playframework


【解决方案1】:

Scalar[String] 对我很有效,就像

DB.withConnection { implicit connection =>
  SQL("""
    select salt from devices
    where principal_id=(
      select id from principals 
      where principal={id})
  """).on('id -> user)
  .as(scalar[String].singleOpt) match {
    case Some(selectSalt) => println("Do something with selectSalt")
    case _ => println("No selectSalt found with id="+user)
  }

如果有多个行满足principle={id} 条件的可能性,您可以在SQL 中使用limit 1。除了match,您还可以使用getOrElse,具体取决于您要如何处理无行/空条件:

.as(scalar[String]).singleOpt).getOrElse("") // No Salt found with given id

【讨论】:

  • 我用 getOrElse 尝试了第二个,但是当有空值时程序会冻结,就像以前一样:val selectSignature: String = SQL( """ select signature from devices where principal_id=(select id from principals where principal={id}) """).on( 'id -> user).as(scalar[String].singleOpt).getOrElse("null")
  • 你有什么版本的 play、scala 和 postgresql - 可能有点有趣......?你也可以分享你的数据库表和案例类定义吗?
【解决方案2】:

试试这个:

.as(str("salt").singleOpt)

【讨论】:

  • 您是否收到错误消息?你在 selectSalt 中得到了什么?
  • 程序什么也没做就停止了,之后我有一个 println 命令没有显示
猜你喜欢
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2016-10-18
  • 2019-09-23
  • 1970-01-01
相关资源
最近更新 更多