Адаптировано из более раннего ответа Тобиаса, в котором правильно указано использование sql-login-hook
для отправки SQL через функции comint.
В Postgres мне нужно было отправлять каждую команду отдельно, поэтому здесь я использовал для этого comint-send-string
(и Майкл, сопровождающий sql.el, указал, что это действительно предпочтительный метод).
Обратите также внимание на то, что один и тот же sql-login-hook
используется со всеми продуктами баз данных, поэтому рекомендуется проверить sql-product
перед отправкой команд для конкретного продукта. Я включил проверку для Oracle в этом случае.
(add-hook 'sql-login-hook 'my-sql-login-hook)
(defun my-sql-login-hook ()
"Custom SQL log-in behaviours. See `sql-login-hook'."
(when (eq sql-product 'oracle)
(let ((proc (get-buffer-process (current-buffer))))
(comint-send-string proc "SET COLSEP \"|\";\n")
(comint-send-string proc "SET LINESIZE 9999;\n")
(comint-send-string proc "SET PAGESIZE 9999;\n"))))
Обратите внимание, что вы должны включить новую строку в конце команды, чтобы воспроизвести ввод RET при интерактивной отправке команды. (Если вы этого не сделаете, команда(ы) по-прежнему будут «введены», но не вступят в силу, пока вы вручную не наберете RET в командной строке).
Если это все еще не работает, обратите внимание, что sql-login-hook
запускается только sql-product-interactive
, если он распознает интерактивную подсказку SQL в буфере. Это приглашение сопоставляется с использованием регулярного выражения sql-prompt-regexp
(которое устанавливается с использованием значений по умолчанию для каждого продукта в sql-product-alist
). Если шаблон по умолчанию не соответствует вашим подсказкам, вы можете изменить его в sql-interactive-mode-hook
.
Например, следующее позволяет запросам Postgres включать в имя базы данных символы, составляющие символы (такие как символ подчеркивания _
), а также символы, составляющие слово:
(add-hook 'sql-interactive-mode-hook 'my-sql-interactive-mode-hook)
(defun my-sql-interactive-mode-hook ()
"Custom interactive SQL mode behaviours. See `sql-interactive-mode-hook'."
(when (eq sql-product 'postgres)
;; Allow symbol chars in database names in the prompt.
;; Default postgres pattern was: "^\\w*=[#>] " (see `sql-product-alist').
(setq sql-prompt-regexp "^\\(?:\\sw\\|\\s_\\)*=[#>] ")))
person
phils
schedule
05.11.2014