给定一个由多行MySQL查询组成的文件,例如
SELECT foo, bar, etc FROM blah WHERE something or other LIMIT etc
有没有什么办法可以直观地在Vim中select一个查询,通过MySQLpipe道,查看查询并产生一个新的缓冲区?
澄清:我不希望表格输出,但可以在vim中进一步处理或导入到电子表格(如从MySQL – 批处理得到的制表符分隔的输出)(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插件 – 尽管他们似乎没有提供原始输出。
我已经在我的.vimrc文件中提供了以下内容,受Matias的答案启发。 这是我第一次尝试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(或:调用Query()),结果在新的缓冲区中打开。
它假定linux(使用mktemp)并从.my.cnf获取连接详细信息
试试dbext插件。
但是这个任务还有其他的一些。