【问题标题】:How to use select statement using slick?如何使用 slick 使用 select 语句?
【发布时间】:2020-08-26 22:32:45
【问题描述】:

我想使用 slick 从下面的示例表中查询数据

   | id  | username | password   |           
   +-----+----------+------------+
   |  1  | admin    | admin@123  |
   |  2  | user     | user@123   |

查询是

    SELECT password FROM users WHERE username = 'user';

我已经阅读了很多关于堆栈溢出的精巧示例,但它们是更复杂的查询

我想要一个使用 slick 的简单查询。

【问题讨论】:

  • 我认为您的示例与docs 中的示例几乎相同,但列名不同。
  • @Jasper-M 。我试过这个。 users.filter(_.username === username).take(1).result.headOption 。但这似乎是错误的。
  • 你在.take(1)之前忘记了.map(_.password)
  • @MateuszKubuszok 你这样说users.filter(_.username === username).map(_.password).take(1).result.headOption ? .它显示和错误。

标签: postgresql scala playframework sbt slick


【解决方案1】:

对于这种情况,您可以只使用plain SQL query

sql"""SELECT password FROM users WHERE username = 'user'""".as[String]

这比构建查询的可移植性差,但可以让您编写任意查询并运行它,而没有 SQL 注入的风险。虽然如果您只使用此类查询,那么您首先没有理由使用 Slick - 您可以使用 Quill 或 Doobie(或两者)或 ScalikeJDBC 或 jOOQ。

【讨论】:

    【解决方案2】:

    使用 slick,您可以编写如下实现:

    trait UsertDAO {
      this: DbComponent =>
    
      import driver.api._
        case class User(id: Int, username: String, password: String)
    
      val userTableQuery = TableQuery[UserTable]
    
        class UserTable(tag: Tag) extends Table[User](tag, "user") {
            val id = column[String]("id", O.SqlType("NUMBER"))
            val username = column[String]("username", O.SqlType("VARCHAR(200)"))
            val password = column[String]("password", O.SqlType("VARCHAR(200)"))
    
            def pk: PrimaryKey = primaryKey("pk", id)
    
            def * : ProvenShape[CjTable] =
              (id, username, password) <> (User.tupled, User.unapply)
          }
    
    }
    

    上面的类定义了你的表结构。稍后您可以定义您的方法,例如运行 sql 查询。 :

      def getPassword(userName: String): Future[Option[String]] = {
        db.run{
          userTableQuery.filter(_.username === userName).map(_.password).to[List].result.headOption
        }
      }
    

    如果您仍然遇到任何问题,请尝试查看我制作的 CRUD 应用程序:https://github.com/SangeetaGulia/Student-CRUD-Slick/blob/master/Student-Slick-Project.zip

    【讨论】:

      【解决方案3】:

      首先定义一个代表你的 SQL 表的类

      class UsersTable(tag: Tag) extends Table[User](tag, "users") {
      
        def email: Rep[String] = column[String]("email", O.PrimaryKey)
        def password: Rep[String] = column[String]("password")
        def registered: Rep[Boolean] = column[Boolean]("registered")
        def firstName: Rep[Option[String]] = column[Option[String]]("first_name")
        def lastName: Rep[Option[String]] = column[Option[String]]("last_name")
        def username: Rep[Option[String]] = column[Option[String]]("username", O.Unique)
        def contact: Rep[Option[String]] = column[Option[String]]("contact")
      
        override def * = (email, password, registered, firstName, lastName, username, contact) <> (User.tupled, User.unapply)
      }
      

      然后为您的表创建一个 DAO,该 DAO 具有选择“一个”行的方法。像这样:

      class UsersDao @Inject()(protected val dbConfigProvider: DatabaseConfigProvider)
                              (implicit executionContext: ExecutionContext) extends HasDatabaseConfigProvider[JdbcProfile]  {
        import profile.api._
        private val Users = TableQuery[UsersTable]
      
        def selectOne(email: String): Future[Option[User]] = db.run(Users.filter(_.email === email).result.headOption)
      
      }
      

      现在在您的服务类中读取这样的记录

      class AuthService @Inject()(usersDao: UsersDao) {
        def someFunction(.. some_params ..) {
          usersDao.selectOne(someParama.email).flatMap {
            case Some(user: User) => //Do something if user exists
            case None => //Do something else if user doesn't exist
          }
        }
      }
      

      如果您有兴趣探索用 Scala 编写的游戏项目,请查看此项目https://github.com/ashishtomer/fastscraping-web

      【讨论】:

        猜你喜欢
        • 2015-09-17
        • 1970-01-01
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-20
        相关资源
        最近更新 更多