Racket/Scheme:如何构造具有可变参数数的查询?

Racket/Scheme:如何构造具有可变参数数的查询?,scheme,racket,Scheme,Racket,我陷入了这个问题,正在寻找一种干净的方法来构建这个查询 基本上,我愿意在表的某些字段上运行更新,但是确切的字段是动态的,由传递给函数的参数决定 (define (update-user user-id #:first-name [first-name #f] #:last-name [last-name #f]) (query-exec dbc (string-append "UPDATE u

我陷入了这个问题,正在寻找一种干净的方法来构建这个查询

基本上,我愿意在表的某些字段上运行更新,但是确切的字段是动态的,由传递给函数的参数决定

(define
  (update-user user-id
               #:first-name [first-name #f]
               #:last-name [last-name #f])
    (query-exec
     dbc
     (string-append
      "UPDATE user"
      (if first-name
      "SET first_name = ?"
      ""
      )
      (if last-name
      "SET last_name = ?"
      ""
      )
      "WHERE identifier = ?")

     ; ?? how to pass dynamically the arguments ?

      user-id
     ))
因此,仅当提供了参数时,更新才应在first_name上运行,与last name相同。我可以自己构建查询,但是我不知道如何传递(或者不传递!)之后的参数

或者查询应该以完全不同的方式构建

提前谢谢

免责声明:我只在模拟版的
query exec
上尝试过这一点,因此您可能需要做一些细微的更改:

您应该能够混合使用
apply
list*

(定义(构建查询con-pre-verb-post-lst)
(让((钥匙(汽车lst)))
(let循环((lst(cdrlst))(sql“”)(parms'())
(如果(或(null?lst)(null?(cdr lst)))
(列表*con(字符串附加前“sql”后)(反向(cons键参数)))
(出租((现场(车辆lst))(val(cadr lst)))
(环路
(cddr lst)
(字符串附加sql(格式“~a~a=?”(if(null?parms)动词“,”)字段)
(cons val parms(()())))
然后

(apply query-exec (build-query con "UPDATE user" "SET" "WHERE identifier=?" '("123456" "first_name" "Patrick")))
=> (query-exec con "UPDATE user SET first_name=? WHERE identifier=?" "Patrick" "123456")
(apply query-exec (build-query con "UPDATE user" "SET" "WHERE identifier=?" '("123456" "first_name" "Patrick" "last-name" "Useldinger")))
=> (query-exec con "UPDATE user SET first_name=?, last-name=? WHERE identifier=?" "Patrick" "Useldinger" "123456")