使用 Scala Slick 实现高阶函数,实现 DRY 优点

2024-03-23

我知道我的 Scala Slick 数据访问层应该是什么样子,但我不确定这是否真的可能。

假设我有一个 User 表,其中包含 id、电子邮件、密码等常用字段。

  object Users extends Table[(String, String, Option[String], Boolean)]("User") {
    def id = column[String]("id", O.PrimaryKey)
    def email = column[String]("email")
    def password = column[String]("password")
    def active = column[Boolean]("active")
    def * = id ~ email ~ password.? ~ active
  }

我希望以不同的方式查询它们,目前丑陋的方式是有一个新的数据库会话,进行 for 理解,然后执行不同的 if 语句来实现我想要的。

e.g.

  def getUser(email: String, password: String): Option[User] = {
    database withSession { implicit session: Session =>
      val queryUser = (for {
        user <- Users
          if user.email === email &&
             user.password === password &&
             user.active === true
      } //yield and map to user class, etc...
  }

  def getUser(identifier: String): Option[User] = {
    database withSession { implicit session: Session =>
      val queryUser = (for {
        user <- Users
        if user.id === identifier &&
           user.active === true
      } //yield and map to user class, etc...
  }

我更喜欢的是有一个用于查询的私有方法,然后是沿着以下方式定义查询的公共方法

type UserQuery = User => Boolean

private def getUserByQuery(whereQuery: UserQuery): Option[User] = {
  database withSession { implicit session: Session =>
      val queryUser = (for {
        user <- Users
          somehow run whereQuery here to filter
      } // yield and boring stuff
  }

def getUserByEmailAndPassword(email, pass){ ... define by query and call getUserByQuery ...}

getUserById(id){….}

getUserByFoo{….} 

这样,查询逻辑就被封装在相关的公共函数中,而实际的查询和到用户对象的映射是在一个其他人不需要关心的可重用函数中。

我遇到的问题是尝试将“where”位重构为我可以传递的函数。尝试做一些事情,比如在 intellij 中选择它们并使用重构会导致一些非常疯狂的打字。

有没有人有任何例子可以展示他们所做的接近我想要实现的目标?


1) 将查询包装在 def 中意味着查询语句会在每个请求上重新生成,并且由于查询参数未绑定,因此不会将准备好的语句传递到底层 DBMS。

2)你没有利用组合的优势

相反,如果您定义 def 查询包装器调用的参数化查询值,则可以两全其美。

val uBase = for{
  u  <- Users
  ur <- UserRoles if u.id is ur.UserID
} yield (u,ur)

// composition: generates prepared statement one time, on startup
val byRole = for{ roleGroup <- Parameters[String]
  (u,ur) <- uBase
  r <- Roles if(r.roleGroup is roleGroup) && (r.id is ur.roleID)
} yield u

def findByRole(roleGroup: RoleGroup): List[User] = {
  db withSession { implicit ss:SS=>
    byRole(roleGroup.toString).list
  }
}

如果您需要一次性查找单个房产,请使用:

val byBar = Foo.createFinderBy(_.bar)
val byBaz = Foo.createFinderBy(_.baz)

不记得在哪里了,也许是在 SO 或 Slick 用户组上,但我确实看到了一个非常有创意的解决方案,它允许多个绑定参数,基本上是一个createFinderBy使用类固醇。但对我来说不太有用,因为解决方案仅限于单个映射器/表对象。

无论如何,为理解而写作似乎可以实现您想要做的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Scala Slick 实现高阶函数,实现 DRY 优点 的相关文章

随机推荐

  • 无法从 $this->db->last_query() 获取结果;代码点火器

    这是一个很简单的问题 必须讨论很多次 但我仍然无法得到 this gt db gt last query 的结果 this gt db gt select count as totalverified res sales upduser e
  • 如何使用 ITextSharp 将图像添加到 PDF?

    我想使用 iTextSharp 5 0 5 但没找到这个版本的教程 我下载了一些以前版本的教程 但出现错误 我只想通过 iTextSharp 将一些图像拼接成 pdf 文件 谁能给我代码吗 编辑 经过一段时间的研究 我终于弄清楚如何添加图像
  • 如何对 qt 图形视图小部件/项目进行单元测试

    我有一个广泛使用 Qt4 中的 GraphicsView 架构的应用程序 我想开始 ui 组件的自动化测试 但我找不到任何与what我应该测试或如何测试基于 qgraphicsview qgraphicswidget 的类 我在尝试对 QG
  • Rails:我无法在重定向中传递验证错误

    所以这是一个简单的项目 其中有产品 您可以对其进行投标 想想易趣 我构建的项目如下 rails new routetest rails g scaffold product productname reserveprice integer
  • 有没有办法在没有“e”参数的情况下阻止 JavaScript 中的气泡?

    我看到很多教程告诉我防止气泡的方法是使用 e 参数 就像 function e e preventDefault 但在某些情况下 萤火虫告诉我 e is not Define 是错误的 那么有没有办法不用参数e就可以阻止气泡呢 如果您使用元
  • 使用 PHP 上传非常大的数据

    我想允许将非常大的文件上传到我们的 PHP 应用程序中 数百兆 8 GB 然而 这存在一些问题 Browser HTML 上传的反馈很糟糕 我们需要轮询进度 这有点傻 或者根本不显示任何反馈 Flash 上传程序在开始上传之前将整个文件放入
  • PHP,读取通过cURL发送的XML文件

    我有这段代码 通过 cURL 将 XML 文件中的数据发送到新闻办公室 现在我希望得到媒体的反馈 表明我的订单已确认或完成 我也希望将其包含在 XML 文件中 我知道如何通过curl发送文件 现在我想知道如何接收它们 以便我可以读出数据 欢
  • 优化:将浮点数乘以整数还是另一个浮点数更快

    如果我尝试将浮点数乘以整数 则将其乘以整数表示的整数是否更快 int x float y 0 5784f x Where x contains a dynamically chosen whole number 或通过另一个浮点数 前提是精
  • 猫鼬网络服务器 helloworld 程序

    我遇到了一个名为 mongoose 的嵌入式 Web 服务器http code google com p mongoose http code google com p mongoose 我读了维基 它很棒 我搜索了一些示例 hello w
  • iOS 中屏幕关闭/设备锁定时定时器不运行

    应用程序位于后台 在与 BLE 设备断开连接时会收到回调 之后应用程序必须等待一段时间 1 分钟 然后执行一些代码 如果屏幕打开 即使在后台 应用程序也会按预期运行 但是 如果屏幕关闭 则计时器将无法工作 并且应用程序不会按预期执行 这是
  • bash 正则表达式带引号?

    下面的代码 number 1 if number 0 9 then echo matched fi 作品 但是 如果我尝试在正则表达式中使用引号 它就会停止 number 1 if number 0 9 then echo matched
  • Angular Material Stepper - 如何动态创建组件以加载到步骤中

    我看过很多类似的帖子 我希望能够使用 ngFor创建组件然后加载到步骤中材料步进机 https material angular io components stepper overview 我一直在关注一个动态加载示例 https sta
  • Symfony 2.8+,教义继承和形式

    在开始之前 请注意我正在学习 symfony 所以请记住这一点 我只是想了解它是如何工作的 这就是我想要实现的目标 我想使用学说制作一个实体继承的简单示例 这就是我的示例的样子 摘要父类 特点 儿童1班 Magician 儿童2班 Warr
  • 如何更改mvc3中razor中LabelFor的显示名称?

    在我用过的剃须刀引擎中LabelFor显示名称的辅助方法 但显示名称似乎不太好显示 所以我需要更改我的显示名称该怎么做 Html LabelFor model gt model SomekingStatus new class contro
  • OpenCV - 薄板样条翘曲的合适实现

    我有一张脸的形状以及该脸的重建 我想对初始形状的相应图像进行建模 基本上 我想将点从原始形状移动到面部重建指示的位置 我尝试通过使用薄板样条翘曲来做到这一点 它的实现如下 http ipwithopencv blogspot ro 2010
  • 在 Asp.Net Mvc 中使用 Ajax 刷新表列表

    我的模式有问题 在创建新条目后 我的表列表没有显示表中最后创建的行 在我的数据库中它已经存在 它仅在刷新页面后才显示 我尝试了一些东西 但只第一次起作用 来自 在 ASP NET MVC 中使用 AJAX 刷新表 https stackov
  • 使用ajax url调用函数

    希望我能正确地问这个问题 因为我知道我想要它做什么 但似乎无法从搜索中找到任何答案 我有一个 func php 页面 其中包含所有函数 并且我希望 ajax 使用该页面中的一个函数 func php function toptable ec
  • Python DataFrame 从每日数据中选择每月增量的行

    让我们直接进入问题吧 以下为每日数据 AAA BBB CCC date 2012 04 16 44 48 28 48 17 65 2012 04 17 44 59 28 74 17 65 2012 04 18 44 92 28 74 17
  • CouchDB 对 _users 数据库的读/写限制

    我想限制用户权限 以便普通用户只能读 写自己的用户文档 我设法设置写入权限 以便用户只能编辑自己的文档 通过设计文档中的 validate doc update 函数 现在我只需限制用户查看用户列表或其他用户文档即可 如果我将数据库读取权限
  • 使用 Scala Slick 实现高阶函数,实现 DRY 优点

    我知道我的 Scala Slick 数据访问层应该是什么样子 但我不确定这是否真的可能 假设我有一个 User 表 其中包含 id 电子邮件 密码等常用字段 object Users extends Table String String