【问题标题】:Updating multiple rows using instr使用 instr 更新多行
【发布时间】:2022-10-06 17:23:05
【问题描述】:

我正在尝试拨打以下电话:

UPDATE MyTable SET path = ? WHERE instr(title, ?) AND start - ? < 60

但是我无法将instr 与GRDB 一起使用。

_ = try dbQueue?.write { db in
    try MyTable
        .filter(Column(\"start\") > date - 60)
        .filter(title.contains(Column(\"title\")))
        .updateAll(db,
                   Column(\"path\").set(to: path)
        )
}

我怎样才能正确地做到这一点?我也可以运行原始查询吗?如果使用原始查询,如何用我的变量填充?

  • 你需要详细说明但是我无法将 instr 与 GRDB 一起使用。
  • 好吧,我想进行确切的查询,但我不知道如何使用 GRDB 运行它。如果我使用过滤器,我怎么能告诉他使用 instr?

标签: swift sqlite grdb


【解决方案1】:

GRDB 不附带对instr 函数的内置支持。您可以在代码中定义它:

func instr(_ lhs: some SQLExpressible, rhs: some SQLExpressible) -> SQLExpression {
    SQL("INSTR(\(lhs), \(rhs))").sqlExpression
}

// SELECT * FROM myTable WHERE instr(?, title)
let title: String = ...
let request = MyTable.filter(instr(title, Column("title")))

// UPDATE myTable SET path = ? WHERE instr(?, title)
let path: String = ...
try request.updateAll(db, Column("path").set(to: path))

请参阅How do I print a request as SQL? faq 以控制 GRDB 生成的 SQL。

【讨论】:

  • 谢谢你的答案。我将其标记为正确,但最终我改用了 RAW Sql,因为如果有人阅读我的代码,我发现代码更容易理解。
  • 是的,这是合法的。如果你有时间,你可以用你自己的解决方案来回答你自己的问题,这样读者就可以选择他们喜欢的一个。
【解决方案2】:

以下是我如何使用原始 SQL 解决它,以防扩展框架过于复杂。 我选择这样,因为我认为这对于需要阅读代码并且没有 GRDB 或一般框架经验的人来说更容易理解。

do {
  var dbQueue:DatabaseQueue? = try DatabaseQueue(path: "PATH_TO_DATABASE")
  try dbQueue?.write { db in
    try db.execute(
      sql: "UPDATE MyTable SET path = :path WHERE instr(title, :title)",
      arguments:  ["path": path, "title": title]
    )
  }
} catch {
  print("UPDATE MyTable \(error)")
}

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2011-06-03
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多