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")