7

给定一个包含多行 MySQL 查询的文件,例如

SELECT foo, bar, etc
FROM blah
WHERE something or other
LIMIT etc

有什么方法可以让我在 Vim 中直观地选择一个查询,通过 MySQL 进行管道传输,然后查看查询并生成一个新的缓冲区?

澄清:我不想要表格输出,而是可以在 vim 中进一步处理或导入电子表格的东西(比如从 mysql --batch 获得的制表符分隔输出)(Ubuntu Linux)。

4

3 回答 3

20

Dbext插件支持这种行为。

直观地选择 SQL 语句,然后运行:DBExecRangeSQL以执行它。

结果将返回到当前视口底部的新拆分中。

控制输出窗口的选项有很多。看看:help dbext辉煌的细节。

dbext 示例输出

2012 年 5 月 1 日更新

该插件的 15.0 版本已发布,内置此功能。

-t可以覆盖默认标志

默认设置:

let g:dbext_default_MYSQL_extra = '-t'

覆盖批量设置

let g:dbext_default_MYSQL_extra = '--batch --raw'

Dbext 将-t选项硬编码到 MySQL,但如果从 dbext.vim 中删除该行,则在 DB_MYSQL_execSql(我当前版本)的第 2278 行,您可以传递 --batch 和 --raw 选项:

:DBSetOption MYSQL_cmd_options='--batch --raw'

要恢复表格输出:

:DBSetOption MYSQL_cmd_options='-t'

我在我的安装中成功测试了这个。

于 2012-04-12T14:13:02.220 回答
2

感谢 Michael 和 Zsolt Botykai 对 dbext 和其他 vim 插件的建议——尽管它们似乎没有提供原始输出。

受Matias 的回答启发,我在 .vimrc 中添加了以下内容。这是我第一次尝试 vimscript,所以请注意...

function Query() range
    " use a temp file for result
    let s:tmpfile = system('mktemp')
    " single line copy of query followed by blank line
    echo system('echo '.shellescape(join(getline(a:firstline,a:lastline)," ")).
    \ ' > '.s:tmpfile)
    echo system('echo >> '.s:tmpfile)
    " pipe through mysql into temp file
    echo system('echo '.shellescape(join(getline(a:firstline,a:lastline),"\n")).
    \ '| mysql --batch --silent --raw &>> '.s:tmpfile)
    " and open in new buffer
    exec 'ed '.s:tmpfile
endfunction
" select query and <F5>
vmap <F5> :call Query()<cr>

可视选择查询,按 F5(或 :call Query()),结果在新缓冲区中打开。

它假定 linux(使用 mktemp)并从 .my.cnf 获取连接详细信息

于 2012-04-13T10:40:08.437 回答
1

试试dbext插件。

但是这个任务还有一些其他的。

于 2012-04-12T14:13:03.110 回答