【问题标题】:How to make an INSERT IGNORE query with Slick?如何使用 Slick 进行 INSERT IGNORE 查询?
【发布时间】:2013-02-13 19:29:17
【问题描述】:

由于我在一个项目中使用的主题数据的性质,在输入集中经常会遇到重复记录(有时这意味着同一输入集中的重复记录,这可以通过以下方式轻松处理预插入过滤,但通常输入集可以包含与数据库中已有记录重复的记录。

MySQL 和 SQLite INSERT IGNORE 功能在处理这个问题上大有帮助。

所以我的问题是:

  1. 在将数据插入 MySQL 或 SQLite 数据库时,如何使 Slick 使用 INSERT IGNORE 而不是纯 INSERT

  2. 将 Slick 与本机不支持的 MS SQL Server 一起使用时,模拟 INSERT IGNORE 功能的最佳方法是什么?

【问题讨论】:

  • 我建议您对 Slick 提出功能请求,我认为如果将其用作默认方法,将会有更多人受益。
  • 两年前添加了一个问题 - github.com/slick/slick/issues/1480 并在几周前使用标签 FUTURE 进行了更新。

标签: scala slick


【解决方案1】:

我没有使用 Slick 的经验。从我收集到的源代码中,为了使 Slick 能够使用 INSERT IGNORE,您需要执行几个步骤:

  • 扩展所需数据库的驱动程序
  • 覆盖通过def createInsertBuilder(node: Node): InsertBuilder 创建的默认InsertBuilder。扩展它并添加一个类似于buildInsert 方法的专用方法。
  • 覆盖通过def createCountingInsertInvoker[T, U](u: ShapedValue[T, U]) 创建的默认InsertInvoker。扩展它并添加insertIgnore,它应该类似于FullInsertInvoker中的def insert[TT](query: Query[TT, U])(implicit session: Session): RetQuery

关于你的第二个问题。 INSERT IGNORE 不受支持时的解决方法的实现取决于数据库,谷歌将帮助您找到不同的实现。由于上述添加INSERT IGNORE 的方法与驱动程序无关,因此您可以使用相同的结构为任何数据库添加功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多