问题描述
我正在使用 nim 和 db_sqlite
从数据库表中获取一些带有特定 _id
的行。例如:
for row in db.fastRows("SELECT * FROM t WHERE _id IN (?,?)",@["1","2"]):
echo row
这按预期工作,但是,最后的序列是在运行时动态构造的,这意味着我需要在查询中使用可变数量的 ?
。我最终创建了一个带问号的序列,加入它们,插入字符串并将其转换为数据库查询:
var qs : seq[string]
for id in ids:
qs.add("?")
let query_string = """SELECT * FROM t WHERE _id IN ($1)""" % join(qs,",")
let query = sqlQuery(query_string)
for row in db.fastRows(query,ids):
echo row
有没有更好的方法在 nim 中构造 select ... in
查询?理想情况下,?
中只有一个 sqlQuery
。
(就其价值而言,目前的行为与我使用过的其他语言相似)
解决方法
您可以手动进行替换,这是使用 strformat 和 map 的一种方法
import strformat,db_sqlite,sequtils,strutils
#assuming ids is a seq[string] here
let query = sql(&"SELECT * FROM t WHERE _id IN ({ids.map(dbQuote).join(\",\")})")
for row in db.fastRows(query):
echo row