Могу ли я выполнить запрос 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 для славных деталей.

dbext example output

обновление 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


попробовать dbext плагин.

но есть несколько другоедля этой задачи.