我正在嘗試撥打以下電話:
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)
)
}
我怎樣才能正確地做到這一點?我也可以運行原始查詢嗎??如果使用原始查詢,如何用我的變數填充?
uj5u.com熱心網友回復:
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))
請參閱如何將請求列印為 SQL?faq 以控制 GRDB 生成的 SQL。
uj5u.com熱心網友回復:
以下是我如何使用原始 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)")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511669.html
標籤:迅速sqlite数据库
