在Slick中的insert语句中使用函数

时间:2014-08-22 04:20:23

标签: scala slick

是否可以在光滑的插入语句中使用用户定义的函数?这就是我的表格,但是当我尝试运行它时出现错误。

case class User(username: String, email: String)

class Users(tag: Tag)
  extends Table[User](tag, "users") {

    def username = column[String]("username", O.PrimaryKey)
    def email = column[String]("email", O.NotNull)
    def password = column[String]("password", O.NotNull)
    def preferences = column[JsValue]("preferences")

    def idx = index("idx_users_email", email, unique = true)

    def group = foreignKey("fk_group", username, groups)(_.groupname)

    def * = (username, email) <> (User.tupled, User.unapply)
    def withPassword = (username, email, password) <>[(User, String), (String, String, String)](
                                        { case (u: String, e: String, p: String) => (User(u, e), p)},
                                        { case (r: User, p: String) => Some((r.username, r.email, p))}
                                        )
}

object users extends TableQuery(new Users(_)) {

  val crypt = SimpleFunction.binary[String, String, String]("crypt")
  val gen_salt = SimpleFunction.binary[String, Option[Int], String]("gen_salt")

  def createUser(u: String, e: String, p: String)(implicit session: Session) = {
      val user = User(u, e)

      val s = this.map {c =>(c.username, c.password, users.crypt(c.password, users.gen_salt(LiteralColumn("bf"), LiteralColumn(7))))}
      s insertExpr (u, e, p)
  }
}

当我运行此代码时,我收到错误

  

SlickException ::无法使用节点   scala.slick.lifted.SimpleFunction$$anon$2@69ade8b0 crypt,false for   插入数据

我尝试了几种尝试让插件工作的方法。包括这个:

def withPassword = (username, email, users.crypt(password, users.gen_salt(LiteralColumn("bf"), LiteralColumn(7)))) <>[(User, String), (String, String, String)](
                                        { case (u: String, e: String, p: String) => (User(u, e), p)},
                                        { case (r: User, p: String) => Some((r.username, r.email, p))}
                                        )

我是否只是期待太多光滑能够做我想做的事情而只是分解并使用原始SQL?

1 个答案:

答案 0 :(得分:0)

不支持,但我们有一张未来不明的票:https://github.com/slick/slick/issues/928

此外,加密几乎总是在客户端级别更好地处理。数据库级加密具有非常有限的安全保证,因为您将密钥发送到存储加密数据的位置。上述票证中的更多信息。