首页 > 解决方案 > SQL 查询参数的缓冲区本地值

问题描述

使用sql-send-buffer,我可以将 SQL 查询从文件发送到打开的 SQL REPL。我的许多查询都有参数占位符(在 Postgres 语法中$1,, $2&c.)。有没有人有类似的代码sql-send-buffer会提示为这些参数填写值?理想情况下,我希望它存储我提供的值,除非我添加参数或关闭文件,否则不会再次提示。

目前我要么:

  1. 替换文件中的参数,尽量记住不要提交或部署这些测试值(容易出错)
  2. 将查询复制到 REPL 中,在那里替换参数(繁琐)

标签: sqlemacs

解决方案


像这样的东西,也许:

(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来看,它看起来应该可以工作。它将替换存储在缓冲区局部变量中。


推荐阅读