6

我有一堆远程 MySQL 服务器,只允许从本地主机连接。要连接到它们,我执行以下操作:

ssh host
mysql -uuser -psecret -hhost.myhost.com

在 emacs 中,我使用 sql-mysql-mode 配置了与本地 MySQL 的连接:

(setq sql-connection-alist
      '((pool-a
         (sql-product 'mysql)
         (sql-server "localhost")
         (sql-user "user")
         (sql-password "secret")
         (sql-database "")
         (sql-port 3306))
        ))

(defun sql-connect-preset (name)
  "Connect to a predefined SQL connection listed in `sql-connection-alist'"
  (eval `(let ,(cdr (assoc name sql-connection-alist))
    (flet ((sql-get-login (&rest what)))
      (sql-product-interactive sql-product)))))

(defun sql-local ()
  "Connect to the local MySQL server"
  (interactive)
  (sql-connect-preset 'pool-a)
  (delete-other-windows))

(define-key global-map [f10] 'sql-local)

所以,每次我点击F10,我都会得到 MySQL shell。

是否可以调整 sql-mysql,使其通过 ssh 连接到外部机器并在该机器上使用 mysql 程序,这样我就可以从 Emacs 连接到任何地方?

4

3 回答 3

10

Sql模式default-directory在建立与数据库的连接时使用,因此如果变量是TRAMP格式,将首先使用ssh(或其他)连接到远程主机,然后在本地使用数据库客户端。为了自动化,你可以做类似的事情

(defadvice sql-mysql (around sql-mysql-around activate)
  "SSH to linux, then connect"
  (let ((default-directory "/ssh:host.myhost.com:"))
    ad-do-it))

您当然可以替换"/ssh:host.myhost.com:"为询问您要连接哪个主机等的函数调用。

于 2013-06-24T13:43:24.110 回答
2

看一下'sql-mysql-program' to "和'sql-mysql-options'。你可以将第一个绑定到"ssh",第二个绑定到"host mysql"。如果emacs没有插入'sql-mysql- login-params',你会很清楚。如果不是这样,你需要创建一个脚本,只执行“ssh host mysql”,然后将“sql-mysql-program”指向该脚本。

如果您需要同时使用隧道和非隧道 mysql 连接,您可以考虑向“sql-product-alist”添加一个新元素(类似于“tunneled-mysql”)。

于 2013-06-24T06:56:10.067 回答
1

从 Emacs 25.1 开始,在 sql-connection-alist 中有一个新的 sql-default-directory 选项。为每个需要它的服务器设置此项允许您使用来自任何给定服务器的后端程序,而无需任何 defadvice 或特定于产品的技巧。只是您的连接设置,例如:

(sql-default-directory "/host.myhost.com:")

或者,如果您出于某种原因需要指定 ssh:

(sql-default-directory "/ssh:host.myhost.com:")
于 2017-01-16T16:37:50.700 回答