我正在尝试在APPLICATION.rkt
中生成的HTML页面上打印数据库中的值但这是我在执行下面的代码时所看到的
&createstring;&db-conn;SELECT * from students
以下是我要执行的内容:
#lang racket (require db) (require web-server/servlet) (provide/contract (start (request? . -> . response?))) (define db-conn (virtual-connection (lambda () (mysql-connect #:server "localhost" #:port 8889 #:database "SOB" #:user "root" #:password "root")))) (define (start request) (define (createstring id name sid) (string-append "id is " id "and name is " name "and sid is " sid)) (response/xexpr '(html (head (title "SOB")) (body ,@(map (h1) (map createstring (in-query db-conn "SELECT * from students")))) ))) (require web-server/servlet-env) (serve/servlet start #:launch-browser? #f #:quit? #f #:listen-ip #f #:port 8080 #:extra-files-paths (list (build-path "/Users/lalith/Documents/LALITH FILES/MDX/SOB/" "htmlfiles")) #:servlet-path "/servlets/APPLICATION.rkt")
有关我正在做什么的任何建议吗?
答案 0 :(得分:3)
有几个问题。
首先,使用quasiquote
(或"反引号")代替quote
;否则你无法使用,@
(即unquote-splicing
)逃脱它。换句话说,改变
'(html ___)
到
`(html ___)
然后,在,@
转义内,您的map
错误,map
无法与in-query
一起使用。你可能想要这样的东西:
,@(for/list ([(id name sid)
(in-query db-conn "SELECT id, name, sid from students")])
`(h1 ,(createstring id name sid)))
或类似的东西。 (上面的代码会为表中的每一行创建一个1级标题,如果这是你想要的那样。)
编辑以回复评论:看起来id
是数据库中的数字列。如果你有最新版本的Racket,我建议使用~a
,类似string-append
,但会自动将非字符串值转换为字符串。将createstring
的定义更改为:
(define (createstring id name sid)
(~a "id is " id "and name is " name "and sid is " sid))
在早期版本的Racket中(~a
之前),请改用format
(请参阅相关文档)。