我正在尝试更新到Slick 3.0.0 (reactive Slick),但是我不能得到最基本的东西工作。之前我可以做像db.withTransaction { ... }
这样的东西,它会运行,但是我甚至不能让这个编译:
def insertNewFacebookUser(
facebookId: String,
email: String,
firstName: String,
lastName: String
) = {
val user =
(Users.map(u ⇒ (u.email, u.firstName, u.lastName)) returning Users) +=
((email, firstName, lastName))
FacebookAuths.map(f ⇒ (f.userId, f.facebookId)) += ((user.id, facebookId))
user
}
这只是抱怨user.id
被包裹在一些DBIOAction
中,我该如何写它才能编译?
谢谢
在不了解更多模式的情况下:
def insertNewFacebookUser(
facebookId: String,
email: String,
firstName: String,
lastName: String
): DBIOAction[???, ???, ???] = for {
userId <- Users returning Users.map(_.id) += (email, firstName, lastName)
_ <- FacebookAuths += (userId, facebookId)
} yield (User(userId, email, firstName, lastName))
val user: Future[User] = db.run(insertNewFaceBookUser(....)
我不确定DBIOAction的确切类型将返回,因为它取决于您的模式,因此是???
。一切都包装在各种各样的行动,所以当你试图使用userId
直接插入到facebook的auth,这是错误的类型。相反,您要做的是对返回的结果执行map
/flatMap
,并编写更完整的操作。for {...} yield
只是map
和flatMap
上的糖。然后,您将run
您的行动,以获得您的结果的Future
。然后你可以根据需要设置map