Racket SQL:如何在创建表中使用变量值作为表名?

Racket SQL:如何在创建表中使用变量值作为表名?,racket,Racket,是一个很好的用于准备SQL语句的DSL,它与db库一起工作 这些文档显示了如下示例: (require sql) (create-table #:temporary the_numbers #:columns [n integer #:not-null] [d varchar]) 在这个代码中,_number不是一个标识符,它被字面上视为表名 我想做的是: (require sql) (define (my-create-table table-name) (create-tabl

是一个很好的用于准备SQL语句的DSL,它与
db
库一起工作

这些文档显示了如下示例:

(require sql)

(create-table #:temporary the_numbers
  #:columns [n integer #:not-null] [d varchar])
在这个代码
中,_number
不是一个标识符,它被字面上视为表名

我想做的是:

(require sql)

(define (my-create-table table-name)
  (create-table #:temporary table-name
    #:columns [n integer #:not-null] [d varchar]))
这会产生一个错误,因为它将
表名
视为实际的表名,并且它不喜欢其中的连字符(我认为应该可以将其用作表名,但我想我需要做更多的工作以使lib正确地引用它…)


我是个新手,不懂很多技巧。我试着使用了
“table-name
,但是没有用。

这里有一些应该对你有用的东西:

#朗球拍
(需要语法/解析/定义)
(需要sql)
(定义简单宏(我的创建表名称:id)
(创建表#):临时表名
#:列[n整数#:非null][d varchar]))
(我的创建表我的表名称)
这将创建一个名为
my create table
的宏。它本质上是用下面的表达式(创建表的表达式)替换表达式
(我的创建表)
,其中
是任何标识符,并用原始语法中给定的id替换
表名


宏很酷。

您需要的功能在文档的第页中有描述。您可以将表名的标识写入
(Ident:AST,expr)
,其中
expr
生成一个Ident-AST值

> (define (my-create-table table-name)
    (create-table #:temporary (Ident:AST ,(make-ident-ast table-name))
      #:columns [n integer #:not-null] [d varchar]))
> (my-create-table 'the_numbers)
(sql-statement
 "CREATE TEMPORARY TABLE the_numbers (n integer NOT NULL, d varchar)")

我知道这不是很有帮助,但我想你需要一个宏来完成你想做的事情(也就是说,
我的create table
应该是一个宏)。似乎它可能是有用的-我会尝试一些东西,并张贴一个答案,如果它的工作。太好了。。。我不认为在我使用Racket的旅途中,使用宏的借口会这么快到来:)我们如何修改它,使其接受字符串/符号文字或标识符,并具有默认(文字)值?嗯。对于默认值,我认为您需要深入研究更强大的
定义语法
/
语法规则
来定义两个单独的规则-一个有参数,另一个没有参数。我会看一看字符串/符号的东西,然后在我找到答案后发布一个更新。顺便说一句,我认为这目前不起作用:
>(define tblname“hashtable”)>(my create table tblname)(sql语句“create TEMPORARY table tblname(n integer NOT NULL,d varchar)”)
对,我认为这与我的
:id
位有关。让我试着去掉它,看看会发生什么。它目前正在寻找一个标识符,而不是任何表情感谢您的回答!即使有了这个链接,我仍然无法从文档中推断出这个解决方案,不过公平地说,我是个新手。你不觉得这里可能有太多的宏魔法,我们必须跳过这些环来使用变量的值(就像在任何普通代码中一样)我认为宏hoop-jumping主要是
create table
的创建过程,而不是它的名称…?由于某种原因,它首先是一个奇怪的宏,它采用的是id而不是表达式。这里所涉及的主要是撤销,我认为可以将各种
sql
宏看作是
quasikote
的版本,它们在编译时检查内容的结构。它们支持使用
unquote
(在某些地方)动态插入AST,但它们要求您说出计划在那里放置何种AST。有人可能会这样推断,但我认为有时可能会模棱两可,而且我认为最好是明确的。