为啥 Anorm 在将主键作为文本插入时会抛出 TypeDoesNotMatch 异常?

Posted

技术标签:

【中文标题】为啥 Anorm 在将主键作为文本插入时会抛出 TypeDoesNotMatch 异常?【英文标题】:Why does Anorm throw a TypeDoesNotMatch exception when inserting a Primary Key as Text?为什么 Anorm 在将主键作为文本插入时会抛出 TypeDoesNotMatch 异常? 【发布时间】:2015-01-29 15:19:22 【问题描述】:

我在 Postgres 9.4 中有一个以电子邮件地址作为主键的表。然后我使用 Anorm 执行以下操作

 DB.withConnection  implicit connection =>
  SQL"insert into member_login_email(email, password) values ($email, $password)".executeInsert()

执行此操作时,会将正确的值输入到表中,但会抛出 TypeDoesNotMatch 运行时异常:

    at play.api.Application$class.handleError(Application.scala:296) ~[play_2.11-2.3.7.jar:2.3.7]
    at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.11-2.3.7.jar:2.3.7]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.11-2.3.7.jar:2.3.7]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.11-2.3.7.jar:2.3.7]
    at scala.Option.map(Option.scala:145) [scala-library-2.11.1.jar:na]
Caused by: java.lang.RuntimeException: TypeDoesNotMatch(Cannot convert dsfsfadsf@ddd.com: class java.lang.String to Long for column ColumnName(member_login_email.email,Some(email)))
    at scala.sys.package$.error(package.scala:27) ~[scala-library-2.11.1.jar:na]
    at anorm.Sql$.anorm$Sql$$as(Anorm.scala:472) ~[anorm_2.11-2.3.7.jar:2.3.7]
    at anorm.Sql$class.executeInsert(Anorm.scala:350) ~[anorm_2.11-2.3.7.jar:2.3.7]
    at anorm.SimpleSql.executeInsert(Anorm.scala:190) ~[anorm_2.11-2.3.7.jar:2.3.7]
    at repository.MemberLoginEmailRepository$$anonfun$create$1.apply(MemberLoginEmailRepository.scala:17) ~[classes/:na]

似乎 Anorm 期望主键的类型为 Long。有没有办法让 Anorm 接受 Text 类型的主键而不抛出异常?

我查看了source code for Anorm,但一直在努力寻找实际发生的位置。

【问题讨论】:

【参考方案1】:

默认情况下,executeInsert() 使用ResultSetParser[Option[Long]] 来解析从数据库返回的主键。从scaladocs看:

def executeInsert[A](generatedKeysParser: ResultSetParser[A] = SqlParser.scalar[Long].singleOpt)

要使用String 主键来实现这一点,您可以改用它:

executeInsert(SqlParser.scalar[String].singleOpt)

这将返回一个Option[String]

【讨论】:

谢谢,这行得通。一旦 *** 任意限制允许我接受,我会在 6 分钟内接受这个答案。

以上是关于为啥 Anorm 在将主键作为文本插入时会抛出 TypeDoesNotMatch 异常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Dash 在通过 PyCharm 调试时会抛出 TypeError? [关闭]

为啥 MediaPlayer 在创建它的实例时会抛出 NOT present 错误?

为啥我的自定义 UICollectionViewLayout 在单元格之间添加空格时会抛出错误?

为啥Visual Studio在声明字符串数组列表时会抛出异常

为啥 pytest 在测试模型创建时会抛出“AttributeError:'NoneType'对象没有属性'_meta'”错误?

为啥我的 Tomcat 服务器在编译 JSP 时会抛出间歇性 404?