给定一个包含多行 MySQL 查询的文件,例如
SELECT foo, bar, etc
FROM blah
WHERE something or other
LIMIT etc
有什么方法可以让我在 Vim 中直观地选择一个查询,通过 MySQL 进行管道传输,然后查看查询并生成一个新的缓冲区?
澄清:我不想要表格输出,而是可以在 vim 中进一步处理或导入电子表格的东西(比如从 mysql --batch 获得的制表符分隔输出)(Ubuntu Linux)。
该Dbext
插件支持这种行为。
直观地选择 SQL 语句,然后运行:DBExecRangeSQL
以执行它。
结果将返回到当前视口底部的新拆分中。
控制输出窗口的选项有很多。看看:help dbext
辉煌的细节。
该插件的 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'
我在我的安装中成功测试了这个。
感谢 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 获取连接详细信息