【发布时间】:2019-06-05 10:35:59
【问题描述】:
我的目标是在插入时检索Board 实体。如果实体存在,那么我只想返回现有对象(与 add 方法的参数一致)。否则我想返回插入到数据库中的新行。
我将 Play 2.7 与 Slick 3.2 和 MySQL 5.7 一起使用。
该实现基于this 答案,这非常有见地。
同样来自Essential Slick
exec(消息返回消息 += Message("Dave", "那么……我们现在该怎么办?"))
DAO 代码
@Singleton
class SlickDao @Inject()(db: Database,implicit val playDefaultContext: ExecutionContext) extends MyDao {
override def add(board: Board): Future[Board] = {
val insert = Boards
.filter(b => b.id === board.id && ).exists.result.flatMap { exists =>
if (!exists) Boards returning Boards += board
else DBIO.successful(board) // no-op - return specified board
}.transactionally
db.run(insert)
}
编辑:还尝试将+= 部分替换为
Boards returning Boards.map(_.id) into { (b, boardId) => sb.copy(id = boardId) } += board
这也不起作用
表定义如下:
object Board {
val Boards: TableQuery[BoardTable] = TableQuery[BoardTable]
class BoardTable(tag: Tag) extends Table[BoardRow](tag, "BOARDS") {
// columns
def id = column[String]("ID", O.Length(128))
def x = column[String]("X")
def y = column[Option[Int]]("Y")
// foreign key definitions
.....
// primary key definitions
def pk = primaryKey("PK_BOARDS", (id,y))
// default projection
def * = (boardId, x, y).mapTo[BoardRow]
}
}
我希望表中会有一个新行,但是尽管exists 查询被执行了
select exists(select `ID`, `X`, `Y`
from `BOARDS`
where ((`ID` = '92f10c23-2087-409a-9c4f-eb2d4d6c841f'));
结果是false 没有插入。
数据库中没有任何记录接收到任何插入语句(我指的是general_log文件)
【问题讨论】:
-
你有几个错别字,“ sb => b.id === board.id && ”,还有一个有 2 个主键的表?
-
你是对的。我修正了拼写错误(不想完全粘贴我的代码,这些是编辑错误)并调整了表定义(通过同时添加新的演变和 SQL 约束)。不幸的是,错误仍然存在。没有任何插入发生。
-
尝试改变这个 def * = (boardId, x, y) (BoardRow.tupled, BoardRow.unapply)
-
谢谢,但这没有效果。没有帮助。
标签: scala playframework slick