Emacs “sql设置sqli缓冲区”;没有合适的sqli缓冲区“;

Emacs “sql设置sqli缓冲区”;没有合适的sqli缓冲区“;,emacs,elisp,sql-mode,Emacs,Elisp,Sql Mode,我是emacs新手,不太习惯lisp,所以这可能是一个新错误,但我找不到解决方案 我尝试安装sql模式以与mysql数据库交互 为此,我修改了sql.el文件以精确定义sql用户、sql密码、sql数据库、sql服务器和sql端口选项,并在sql mysql登录参数中添加了端口 我启动了emacs和M-xsqlmysql 模式更改为SQLi[MySQL]:运行 我更改缓冲区,M-x查找文件myfile.sql 此缓冲区处于SQL[ANSI]模式 然后,我在C-C-r中输入一条sql语句,并出现错

我是emacs新手,不太习惯lisp,所以这可能是一个新错误,但我找不到解决方案

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

为此,我修改了sql.el文件以精确定义sql用户、sql密码、sql数据库、sql服务器和sql端口选项,并在sql mysql登录参数中添加了端口

我启动了emacs和M-xsqlmysql

模式更改为SQLi[MySQL]:运行

我更改缓冲区,M-x查找文件myfile.sql

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

然后,我在C-C-r中输入一条sql语句,并出现错误“No sql Process started”

如前所述,我在M-x sql中设置了sqli缓冲区,但我有一个错误“没有合适的sqli缓冲区”

对于这个,我找不到解决办法。。。我错过了什么

我使用Emacs24.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)))))))
编辑:当我直接在SQLi[MySQL]:run buffer中执行select语句时,它会按预期返回行


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

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

下面是我的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”,可以在init文件中设置,或使用
M-x自定义变量对其进行自定义

SQL模式非常依赖于使用正确的局部变量设置缓冲区,以便有一个工作关联的iSQL会话

我使用一个典型的序列来启动iSQL缓冲区,并在我已经编辑的另一个缓冲区中进行查询,如下所示

  • 通过访问文件或使用
    C-xb
    创建临时缓冲区,切换到包含SQL文本的缓冲区
  • 使用
    M-x SQL Set product
    将此缓冲区设置为正确的SQL类型,然后在提示符处输入已知类型,如“mysql”
  • 点击
    C-C
    (绑定到
    sql product interactive
    )切换到与此缓冲区关联的iSQL缓冲区,可能是通过定位或创建新的comint进程

  • 阅读
    M-x sql help
    命令的输出可能是值得的。sql模式的文档非常简单。我主要通过阅读源代码了解到我对它所知甚少的地方。

    谢谢你的回答。我过去可以在使用C-x b创建的缓冲区上使用M-x sql模式,这样做是正确的。现在我ave to M-x sql mode RET M-x sql set product RET“postgres”RET。可能是sql find sqli缓冲区代码在Emacs 24中发生了更改。实际上,这仍然给了我一个“未启动sql进程”的提示当我尝试C-C C-C时,迷你缓冲区中出现错误。:/即使sql postgres SQLi缓冲区已经在运行?我认为对于emacs 24,sql模式可能已经改变了一点,因为在一段时间后,我又重新使用了一点,它看起来确实有点古怪。我的1-2-3示例对您也不起作用(用postgres代替mysql)?不,不需要。我需要执行这个舞蹈才能让它工作,而顺序确实很重要:谢谢@felideon。4年后,这仍然不能像文档所述那样工作,但需要设置sql产品和调用sql设置sqli缓冲区。FWIW,您可以自定义sql产品以跳过这一步。