如何正确使用 Slick 生成的 Table <> apply、tupled 等?
How to use the Slick generated Table <> apply, tupled, etc correctly?
我有一个来自 Slick (3.1.1) 的代码生成模型,我知道我可以用它执行以下操作,例如
val action = sql"""SELECT * FROM ${User.baseTableRow.tableName}""".as[UserRow].headOption
db.run(action)
但现在更多地参与 Slick 我有以下查询:
val selectAction = (for {
linkedAccount <- LinkedAccount
user <- User if user.id === sourceUser.id && user.id === linkedAccount.userId
} yield (targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)).
result.map(_.map(LinkedAccountRow.tupled))
我可以将结果元组 (targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)
映射到适当的情况 class LinkedAccountRow
的唯一方法是使用这个丑陋的 .map(_.map(LinkedAccountRow.tupled))
...并且应该有一个使用生成的 <>
、tupled
或?
我个人在 .map(_.map(LinkedAccountRow.tupled))
中没有发现任何丑陋之处,但这仍然不是我使用 slick 的首选方式。
编写 Scala 代码的一个非常重要的事情是,您的目标不是编写紧凑简洁的代码,而是编写可读性强、更简单、更易于理解的代码。
我会像下面那样做,代码多一点但比较清晰,
val selectionAction = LinkedAccount
.join(User)
.on({ case (linkedAccount, user) =>
user.id === sourceUser.id && user.id === linkedAccount.userId
})
.map({ case (linkedAccount, user) =>
(targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)
})
val resultFuture = db.run(selectionAction)
val linkedAccountRowListFuture = resultFuture.map(seq => {
seq.map(tuple => LinkedAccountRow.tupled(tuple)).toList
})
我有一个来自 Slick (3.1.1) 的代码生成模型,我知道我可以用它执行以下操作,例如
val action = sql"""SELECT * FROM ${User.baseTableRow.tableName}""".as[UserRow].headOption
db.run(action)
但现在更多地参与 Slick 我有以下查询:
val selectAction = (for {
linkedAccount <- LinkedAccount
user <- User if user.id === sourceUser.id && user.id === linkedAccount.userId
} yield (targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)).
result.map(_.map(LinkedAccountRow.tupled))
我可以将结果元组 (targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)
映射到适当的情况 class LinkedAccountRow
的唯一方法是使用这个丑陋的 .map(_.map(LinkedAccountRow.tupled))
...并且应该有一个使用生成的 <>
、tupled
或?
我个人在 .map(_.map(LinkedAccountRow.tupled))
中没有发现任何丑陋之处,但这仍然不是我使用 slick 的首选方式。
编写 Scala 代码的一个非常重要的事情是,您的目标不是编写紧凑简洁的代码,而是编写可读性强、更简单、更易于理解的代码。
我会像下面那样做,代码多一点但比较清晰,
val selectionAction = LinkedAccount
.join(User)
.on({ case (linkedAccount, user) =>
user.id === sourceUser.id && user.id === linkedAccount.userId
})
.map({ case (linkedAccount, user) =>
(targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)
})
val resultFuture = db.run(selectionAction)
val linkedAccountRowListFuture = resultFuture.map(seq => {
seq.map(tuple => LinkedAccountRow.tupled(tuple)).toList
})