Racket SQL: как использовать значение переменной в качестве имени таблицы в create-table? - PullRequest
3 голосов
/ 01 августа 2020

https://docs.racket-lang.org/sql/ - хороший DSL для подготовки операторов SQL, который работает с библиотекой db.

В документах показан пример вроде:

(require sql)

(create-table #:temporary the_numbers
  #:columns [n integer #:not-null] [d varchar])

В этом коде the_numbers не является идентификатором, он трактуется буквально как имя таблицы.

Я хочу сделать что-то вроде:

(require sql)

(define (my-create-table table-name)
  (create-table #:temporary table-name
    #:columns [n integer #:not-null] [d varchar]))

Это выдает ошибку, потому что он рассматривает table-name как фактическое имя таблицы, и ему не нравится дефис в нем (я думаю, что можно использовать это как имя таблицы, но я думаю, мне нужно сделать что-то еще, чтобы lib процитируйте это правильно ...)

Я новичок в Racket и не знаю многих трюков. Я пробовал использовать 'table-name, но это не сработало.

Ответы [ 2 ]

3 голосов
/ 02 августа 2020

Необходимые вам функции описаны в Dynami c Statement Composition и SQL Injection документации. Вы можете записать Ident для имени таблицы как (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)")
1 голос
/ 01 августа 2020

Вот что должно сработать для вас:

#lang racket

(require syntax/parse/define)
(require sql)

(define-simple-macro (my-create-table table-name:id)
  (create-table #:temporary table-name
                #:columns [n integer #:not-null] [d varchar]))

(my-create-table my_table_name)

Это создает макрос с именем my-create-table. По сути, это синтаксически заменяет (гигиенически) выражение (my-create-table <some-id>), где <some-id> - любой идентификатор, на приведенное ниже выражение (выражение create-table), заменяя table-name на идентификатор, указанный в исходном синтаксисе.

Макросы прикольные.

...