буфер-локальные значения для параметров SQL-запроса

#sql #emacs

#sql #emacs

Вопрос:

Используя sql-send-buffer , я могу отправить SQL-запрос из файла в открытый SQL REPL. Многие из моих запросов имеют заполнители параметров (в синтаксисе Postgres, $1 , $2 amp; c.) . Есть ли у кого-нибудь код, аналогичный sql-send-buffer , который запрашивает значения для заполнения для этих параметров? В идеале я бы хотел, чтобы он сохранял значения, которые я предоставляю, и не запрашивал повторно, пока я не добавлю параметры или не закрою файл.

В настоящее время я либо:

  1. замените параметры в файле, постарайтесь не забывать фиксировать или развертывать эти тестовые значения (подвержены ошибкам)
  2. скопируйте запрос в REPL, замените там параметры (утомительно)

Ответ №1:

Возможно, что-то вроде этого:

 (defvar my-sql-replacements nil)
(make-variable-buffer-local 'my-sql-replacements)

(defun my-sql-send-buffer-replace ()
  (interactive)
  (let ((string (buffer-substring-no-properties (point-min) (point-max))))
    (while (string-match "[$][0-9]" string)
      (let* ((placeholder (match-string 0 string))
             (replacement (or (cdr (assoc placeholder my-sql-replacements))
                              (read-string (format "Replacement for %s: " placeholder)))))
        (unless (assoc placeholder my-sql-replacements)
          (push (cons placeholder replacement) my-sql-replacements))
        (setq string (replace-regexp-in-string (regexp-quote placeholder) replacement string))))
    (sql-send-string string)))
  

Я не тестировал это на реальном сервере SQL, но из трассировки sql-send-string похоже, что это должно сработать. Он сохраняет замены в локальной переменной буфера.

Комментарии:

1. Спасибо, это отлично сработало. Я внес одно небольшое изменение в регулярное выражение [$][0-9] для обработки запросов с более чем 9 параметрами.