【发布时间】:2013-05-02 04:07:15
【问题描述】:
我正在编写一个带有 Postgres 后端的 Play 2 应用程序。
我的代码有一个 sql 字符串,它是两个插入和一个选择的串联。然后当我尝试执行我的查询时,异常会爆炸并说我没有返回任何结果。我可以把它分成两个单独的查询,但是我会不必要地访问数据库吗?
sql 字符串非常简单。
val sql = """
insert into gameconstants
...
values
...;
insert into gamevariables
...
values
...;
select lastval() as gameid;
"""
然后,引发异常的代码只是尝试从查询中获取游戏 ID。这应该可以吗?
DB.withTransaction { implicit connection =>
val gameid = SQL(sql).on(
... )()
.map(row => row[Long]("gameid")).head
}
这是错误[PSQLException:查询未返回任何结果。]
【问题讨论】:
-
无论如何,您都将前往 DB。 PgJDBC 会将您的复合语句拆分并发送各个语句。查看网络流量或 PgJDBC 调试日志以查看详细信息。
-
所以首选的方法实际上是通过网络发送多个语句?这不是一些容易实现的目标吗?
-
正确的做法是创建一个 JDBC 批处理并发送该批处理。上次我检查 PgJDBC 的批处理支持时,无论如何都只是单独发送每个查询,但这可能最近发生了变化。是的,改进会很棒,但对于所有使用 PgJDBC 的人来说,几乎没有人为它做出贡献。
-
@Mark 也许你应该为此创建一个存储过程。这将减少网络使用量。
标签: postgresql scala anorm