SQL设置SQLi缓冲区:“没有合适的SQLi缓冲区”。

10

我刚开始使用emacs,并不熟悉lisp语言,所以可能是初学者的错误,但我找不到解决办法。

我尝试安装sql模式以与我的mysql数据库交互。

为此,我修改了sql.el文件,以明确sql-user、sql-password、sql-database、sql-server和sql-port选项,并在sql-mysql-login-params中添加了端口。

我启动emacs并输入M-x sql-mysql命令。

模式变为SQLi[MySQL]:run。

我切换到另一个buffer,输入M-x find-file myfile.sql。

此缓冲区处于SQL[ANSI]模式。

然后我使用C-c C-r执行一个sql语句,但出现了“未启动任何SQL进程”的错误。

按照某个地方说的,我输入M-x sql-set-sqli-buffer,但出现了“没有合适的SQLi buffer”的错误信息。

对于这个问题,我无法找到解决办法... 我错过了什么吗?

我使用的是emacs 24.2.1版本。

编辑:当我直接在SQLi[MySQL]:run缓冲区中执行select语句时,它会返回预期的行...

难道另一个缓冲区不应该处于SQL[MySQL]模式吗?

1个回答

17

我认为你说得很对。sql-set-sqli-buffer找不到合适的SQLi缓冲区是因为它在遍历打开缓冲区列表时考虑了SQL-mode缓冲区的产品子类型。

这是我的sql.el副本中的缓冲区测试代码,它随我的emacs发货(版本-GNU emacs 24.2.1)。

(defun sql-find-sqli-buffer (&optional product connection)
  "Returns the name of the current default SQLi buffer or nil.
In order to qualify, the SQLi buffer must be alive, be in
`sql-interactive-mode' and have a process."
  (let ((buf  sql-buffer)
        (prod (or product sql-product)))
    (or
     ;; Current sql-buffer, if there is one.
     (and (sql-buffer-live-p buf prod connection)
          buf)
     ;; Global sql-buffer
     (and (setq buf (default-value 'sql-buffer))
          (sql-buffer-live-p buf prod connection)
          buf)
     ;; Look thru each buffer
     (car (apply 'append
                 (mapcar (lambda (b)
                           (and (sql-buffer-live-p b prod connection)
                                (list (buffer-name b))))
                         (buffer-list)))))))

主要用于测试资格的两个值是缓冲区和标识产品类型的符号。此符号作为参数传递,或默认为sql-product的值。似乎sql-product除非以某种其他方式设置,否则默认为“ansi”,这就是为什么您的编辑缓冲区是SQL[ANSI]的原因。

在尝试将SQLi缓冲区与查询缓冲区相关联之前,应尝试在此缓冲区中设置产品类型(例如使用M-x sql-set-product)。如果您希望默认值始终为“mysql”,则可以在初始化文件中设置此值,或使用M-x customize-variable进行自定义。

SQL模式相当依赖于正确设置本地变量以使得关联的iSQL会话正常工作。

我通常用以下顺序来启动带有查询的iSQL缓冲区:

  1. 通过访问文件或使用C-x b创建临时缓冲区,切换到包含SQL文本的缓冲区。
  2. 使用M-x sql-set-product将此缓冲区设置为正确的SQL类型,然后在提示符处输入已知类型(例如“mysql”)。
  3. 按下C-c <TAB>(绑定到sql-product-interactive)以切换到与此缓冲区关联的iSQL缓冲区,可能通过定位或创建新的comint进程。

阅读M-x sql-help命令的输出可能是值得的。SQL模式的文档非常简单。我大部分从阅读源代码中了解到它的。


谢谢您的回答。我曾经只需要在使用C-x b创建的缓冲区上执行M-x sql-mode,它就会自动完成正确的操作。现在我必须执行M-x sql-mode RET M-x sql-set-product RET "postgres" RET。很可能是Emacs 24中sql-find-sqli-buffer代码发生了变化。 - felideon
实际上,当我尝试使用C-c C-c时,迷你缓冲区仍然会显示“没有启动SQL进程”的错误。 :/ - felideon
即使已经有一个运行中的sql-postgres SQLi缓冲区,你还是遇到了问题吗?我认为在Emacs 24版本中SQL模式可能已经有所改变,因为我离开了一段时间后又开始使用它,但它似乎有点固执。请问我的1-2-3示例(用postgres替换mysql)对你来说是否也无法工作? - cms
2
不,它不行。我需要按照特定的顺序执行这个操作才能使其正常工作:http://paste.lisp.org/display/134684#3 - felideon
感谢@felideon。四年过去了,这仍然不能按照文档工作,但需要设置sql-product并调用sql-set-sqli-buffer。顺便说一下,您可以自定义sql-product以跳过此步骤。 - dk.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接