SQLite.swift documentation for filtered queries给出了这个例子:
users.filter(email.like("%@mac.com"))
// SELECT * FROM "users" WHERE ("email" LIKE '%@mac.com')
由于我想根据用户输入搜索数据库,我想我可以做到以下几点:
let stringPrefix = userInput + "%"
users.filter(email.like(stringPrefix))
// SELECT * FROM "users" WHERE ("email" LIKE 'johndoe%')
我是以正确的方式来做这件事的吗?在过去的其他SQLite环境中,我使用variable binding和?
来避免SQL injection。这是用SQLite.swift在幕后完成的吗?我没有在文档中看到任何信息,只是在Executing Arbitrary SQL部分有一些关于绑定的信息。
答案 0 :(得分:2)
取自this源文件:
@warn_unused_result public func like(pattern: String, escape character: Character? = nil) -> Expression<Bool> {
guard let character = character else {
return "LIKE".infix(self, pattern)
}
return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)])
}
这只是like函数的重载之一。另一个重载看起来非常相似,并且确实也使用参数绑定。在源代码中漫步以自行验证。
但是,我希望您有内部测试来验证SQLite注入是不可能的。