如何在 nim 中构造一个 `select ... in` SQL 查询?

问题描述

我正在使用 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