Могу ли я выполнить запрос MySQL из визуального выбора Vim с выходом в новом буфере
учитывая файл, который состоит из нескольких строк запросов MySQL, например
SELECT foo, bar, etc
FROM blah
WHERE something or other
LIMIT etc
есть ли способ визуально выбрать запрос в Vim, передать его через MySQL и увидеть запрос и результат в новом буфере?
уточнение: я не хочу табличный вывод, но что-то, что может быть дополнительно обработано в vim или импортировано в электронную таблицу (например, вывод, разделенный вкладками, который вы получаете от mysql --batch) (Ubuntu Linux).
3 ответов
на Dbext
плагин поддерживает такое поведение.
визуально выберите инструкцию SQL и запустите :DBExecRangeSQL
, чтобы выполнить его.
результат будет возвращен в новое разделение в нижней части текущего окна просмотра.
есть много и много вариантов для управления окном вывода. См.:help dbext
для славных деталей.
обновление 1.Может.2012
версия 15.0 плагина был выпущен с этой встроенной функциональностью.
по умолчанию -t
флаг может быть переопределен
по умолчанию:
let g:dbext_default_MYSQL_extra = '-t'
переопределено для пакетной настройки
let g:dbext_default_MYSQL_extra = '--batch --raw'
Dbext hard-коды -t
опция MySQL, но если эта строка удалена из dbext.vim, в строке 2278 в DB_MYSQL_execSql (моей текущей версии) вы можете передать --batch и --raw опции:
:DBSetOption MYSQL_cmd_options='--batch --raw'
для восстановления табличного вывода:
:DBSetOption MYSQL_cmd_options='-t'
я успешно протестировал это на своей установке.
спасибо Майклу и Zsolt Botykai за предложение dbext и других плагинов vim - они, похоже, не обеспечивают сырой выход.
Я поместил следующее в мой .vimrc, вдохновленный ответ Матиаса здесь. Это моя первая попытка vimscript, поэтому будьте осторожны emptor...
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) и получает сведения о соединении от .мой.cnf