Новое в журнале. Маленькие pull request: почему их быстрее ревьюят и как резать задачу
Инструменты

mycli: удобный консольный клиент для MySQL вместо стандартного mysql

Подсветка синтаксиса, автодополнение по именам таблиц и столбцов, избранные запросы: разбираем, чем mycli удобнее стандартного клиента и когда лучше остаться на нём.

9 декабря 20256 мин чтенияПрактикам
mycli: удобный консольный клиент для MySQL вместо стандартного mysql
0 конфиговчтобы начать работу
3 минутына установку

Стандартный консольный клиент mysql делает свою работу, но не больше: ни подсветки синтаксиса, ни автодополнения по именам таблиц, ни вменяемого форматирования длинных результатов. Mycli, написанный тем же сообществом, что и pgcli для Postgres, закрывает именно эти неудобства, оставаясь при этом обычным консольным клиентом, без графического интерфейса и лишней магии.

Чем стандартный mysql неудобен на практике

Три вещи раздражают в mysql почти сразу после знакомства. Во-первых, он не подсказывает имена таблиц и столбцов, автодополнение по Tab работает только для ключевых слов SQL и то не всегда. Во-вторых, вывод широкой таблицы с десятком столбцов разваливается на экране в нечитаемую простыню. В-третьих, история запросов хранится как плоский список без контекста, найти нужный SELECT из прошлой недели среди сотен строк почти невозможно.

Главная мысльАвтодополнение по именам таблиц и столбцов экономит не секунды, а десятки обращений к DESCRIBE за рабочий день.

Автодополнение по таблицам и столбцам

Mycli при подключении к базе читает её схему и дальше подсказывает имена таблиц, столбцов и даже значения после WHERE column =, если в таблице не слишком много строк. Автодополнение контекстное: после FROM предлагаются таблицы, а после SELECT подсказываются столбцы именно той таблицы, которая упомянута в FROM.

pip install -U mycli
mycli -u root -h 127.0.0.1 myproject_db

Для разовой установки без системного Python подойдёт и apt install mycli на Debian и Ubuntu, версия в репозитории чуть более старая, но для повседневной работы разницы почти нет.

Подсветка синтаксиса и человеческое форматирование таблиц

Результаты запросов в mycli выводятся аккуратной таблицей с рамками, а не слипшимся текстом, при этом ширина столбцов подстраивается под терминал. SQL-запрос, который вы печатаете, подсвечивается по синтаксису прямо во время ввода: ключевые слова, строки и числа визуально различимы, опечатку в имени функции проще заметить до отправки запроса.

Если таблица результата шире терминала, mycli по умолчанию переключается в постраничный режим через less, это настраивается через параметр pager, но для первого знакомства удобнее не трогать и привыкнуть к горизонтальной прокрутке.
Вы в начале разбораДальше: разбор компромиссов, чек-лист и ответы на частые вопросы.

Избранные запросы вместо копипасты из заметок

Частые запросы, посчитать активных пользователей, найти дубликаты по email, проверить размер таблиц, обычно живут в текстовом файле рядом с проектом, откуда их копируют вручную. В mycli для этого есть команда favoritequery, которая сохраняет запрос под именем прямо в сессии клиента.

favoritequery save active_users SELECT count(*) FROM users WHERE status = 'active';
favoritequery active_users
favoritequery list

После сохранения запрос вызывается по имени одной командой, без повторного набора условий, а favoritequery list показывает весь список сохранённых запросов для текущего подключения. Избранные запросы хранятся в текстовом конфигурационном файле клиента, поэтому их легко скопировать на другую машину или положить в репозиторий проекта рядом с остальными dev-инструментами, чтобы вся команда пользовалась одним и тем же набором диагностических запросов, а не изобретала свой заново.

Избранные запросы поддерживают параметры через именованные плейсхолдеры, это удобно для запросов, которые повторяются с разными значениями: например, поиск заказов конкретного пользователя по его идентификатору. Вместо переписывания условия каждый раз достаточно вызвать запрос с новым значением параметра, а сам текст запроса остаётся неизменным и живёт в одном месте.

Конфигурация через ~/.myclirc

Поведение клиента настраивается в текстовом файле ~/.myclirc: можно включить или выключить подсветку, задать тему цветов, включить предупреждение перед опасными командами и настроить лимит строк для безопасного вывода.

  • destructive_warning = True спрашивает подтверждение перед потенциально опасными запросами
  • row_limit = 1000 обрывает вывод очень больших результатов, чтобы не забить терминал
  • syntax_style и theme меняют цветовую схему подсветки
Возможностьmysqlmycli
Подсветка синтаксисанетесть
Автодополнение по схемечастично, по ключевым словампо таблицам и столбцам
Избранные запросынетесть, favoritequery
Подтверждение опасных команднетнастраивается

Когда стандартный mysql всё же лучше

В продовых скриптах и автоматизации, миграциях, бэкапах, cron-джобах, стоит оставить стандартный mysql: он гарантированно есть на любом сервере без дополнительной установки, не тянет Python-зависимости и ведёт себя предсказуемо в неинтерактивном режиме. Mycli создан для интерактивной работы разработчика за терминалом, а не для встраивания в пайплайны.

Если на сервере нет возможности поставить Python-пакет, mycli можно запускать с ноутбука разработчика через SSH-туннель, подключаясь к удалённой базе напрямую и не устанавливая ничего на сервере.

Подключение к удалённым базам и SSL

Mycli поддерживает те же параметры подключения, что и стандартный клиент: хост, порт, имя пользователя и пароль передаются через те же флаги -h, -P, -u и -p, а соединение по SSL настраивается через переменные ssl-ca, ssl-cert и ssl-key в том же формате, что и в my.cnf. Это удобно, если в команде уже есть готовый конфигурационный файл для стандартного клиента: его можно переиспользовать без изменений, mycli читает секцию [client] из ~/.my.cnf так же, как и mysql.

Для работы с несколькими окружениями, локальная база, стейджинг, продовая реплика только для чтения, удобно заводить отдельные алиасы в шелле на каждое подключение, а не держать единую команду с разными флагами. Это снижает риск случайно выполнить деструктивный запрос не в том окружении, особенно если в приглашении mycli настроено отображение текущей базы и хоста, что по умолчанию включено.

Отдельно стоит упомянуть работу с большими дампами и экспортом: mycli не заменяет mysqldump и не предназначен для пакетной выгрузки данных, для этого остаются специализированные утилиты. Роль mycli ограничена интерактивным исследованием данных и написанием запросов, и попытка использовать его как инструмент миграции обычно приводит к менее предсказуемому поведению, чем при использовании выделенных для этого программ.

Полезная мелочь для ежедневной работы: mycli умеет вертикальный вывод результата, когда строка не помещается в ширину терминала даже после автоподбора ширины столбцов. Команда \G в конце запроса, тот же синтаксис, что в стандартном mysql, переключает вывод построчно на каждое поле вместо таблицы, это особенно удобно при просмотре одной записи с десятками столбцов, где построчный вывод читается заметно легче таблицы с переносами.

Автодополнение mycli работает и для имён баз данных после команды USE, и для системных переменных после SHOW VARIABLES LIKE, то есть покрывает не только пользовательские запросы, но и администраторские команды, которые разработчик обычно печатает реже и хуже помнит наизусть. На практике это снижает число обращений к документации прямо во время работы за терминалом.

Есть и более узкие форки и альтернативы, вроде клиентов с поддержкой нескольких диалектов СУБД сразу, но для разработчика, который работает конкретно с MySQL или MariaDB, они обычно избыточны: лишняя универсальность редко окупается, если нужен именно быстрый и удобный клиент под одну конкретную базу, а не универсальный инструмент на все случаи сразу.

Переход на mycli не требует отказа от привычек, накопленных со стандартным клиентом: большинство команд и флагов совпадают буквально, а новые возможности, автодополнение, подсветка, избранные запросы, включаются сами по умолчанию и просто ускоряют уже привычную работу, а не заставляют переучиваться с нуля.

Частые вопросы

Работает ли mycli с MariaDB так же, как с MySQL?

Да, mycli подключается по тому же протоколу, который использует и MariaDB, различия в диалекте SQL клиент не интерпретирует сам, он просто передаёт запросы серверу. Автодополнение по схеме работает одинаково для обеих баз.

Можно ли использовать mycli в неинтерактивных скриптах?

Технически можно передать запрос через параметр -e, но для скриптов и автоматизации лучше оставить стандартный mysql: он предсказуемее в коде выхода и не требует Python-окружения на сервере, где выполняется скрипт.

Безопасно ли хранить пароль в конфигурации mycli?

Хранить пароль открытым текстом в конфигурационном файле не стоит ни для одного клиента. Пароль лучше передавать через переменную окружения или вводить интерактивно при подключении, а постоянные доступы держать в менеджере секретов.

Код, который не стыдно передать

Начните с принципов, а дальше двигайтесь по рубрикам. Каждый разбор заканчивается чек-листом.

Случайный разбор