我有一堆远程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连接到任何地方?
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:"
替换为函数调用,该函数调用将询问您要连接哪个主机,等等
看一下'sql-mysql-program' to "和'sql-mysql-options'。你可以将第一个绑定到"ssh",第二个绑定到"host mysql"。如果emacs没有在它们之间插入'sql-mysql-login-params',那么就没有问题了。如果不是这样,你需要创建一个脚本,只执行"ssh host mysql",然后将"sql-mysql-program"指向该脚本。
如果你需要同时使用隧道和非隧道mysql连接,你可以考虑在'sql-product- list'中添加一个新元素(类似于"tunnel -mysql")。
从Emacs 25.1开始,在sql-connection- list中有一个新的sql-default-directory选项。为需要它的每个服务器设置此属性,允许您使用来自任何给定服务器的后端程序,而无需任何默认建议或特定于产品的技巧。只需设置您的连接,如:
(sql-default-directory "/host.myhost.com:")
或者,如果出于某种原因需要指定ssh:
(sql-default-directory "/ssh:host.myhost.com:")