Даже среди тех, кто давно и активно пользуется IntelliJ IDEA, есть немало людей, ничего не знающих о плагине, позволяющем работать с базами данных прямо из IDE. Между тем, лично для меня это — одна из самых полезных возможностей IDEA, ибо писать код я могу и в vi. Важно, насколько удобно его потом отлаживать и улучшать. Спрашивается, при чем тут Database support? Собственно, при отладке приложений я его и использую.
Рассказ про плагин Database Support будет совершенно неофициальным, я сам его использовал только в веб-разработке и в разработке под Android, но хардкорным разработчикам жесткого enterprise тоже, надеюсь, будет интересно.
Как-то раз мне пришла в голову мысль написать веб-приложение. Был шанс, что нагрузка на него будет довольно высокой и неравномерной, так что я решил в качестве СУБД использовать PostgreSQL в надежде, что она будет работать быстрее привычной MySQL. Сказано — сделано. Прототип написан, база создана, начинаем заполнять таблицы всякой тестовой гадостью.
Через некоторое время становится ясно, что структуру таблиц надо немного подправить, да и тестовые записи в них расплодились — надо чистить. И тут выясняется, что стандартный инструмент ручной работы с PostgreSQL — pgAdmin — совсем не похож на phpMyAdmin, и вообще он — самостоятельное десктопное приложение.
Встает вопрос, есть ли какая-нибудь универсальная штука, которая может работать удобным интерфейсом к БД, причем интерфейсом, внешний вид которого не зависит от БД, с которой он работает?
В JetBrains такую штуку довольно давно придумали, это плагин Database Support, который работает с IntelliJ IDEA Ultimate, RubyMine, PyCharm Professional Edition и PhpStorm. Он довольно сложен в разработке и поддержке, так что в бесплатные IDE он не ставится.
Посмотрим, чем же он нам может помочь. Для начала, настроим его для работы с PostgreSQL. Если у нас на компьютере еще нет драйвера JDBC для PostgreSQL, IDE нам предложит его скачать и установить. В моем случае СУБД запущена на том же компьютере, что и IDE:
Видите вкладку Database по правому краю? Вот при нажатии на нее и открывается окно плагина Database Support (можно его открыть и через View | Tool Windows | Database, и через список окон Tool Windows):
Теперь посмотрим, что же мы можем сделать с его помощью. Во-первых, можно смотреть структуру БД в окне плагина, а если надо вывести UML-диаграмму, то и это можно (нажимаем <Ctrl+Alt+U>). Во-вторых, нам доступны просмотр и редактирование таблиц БД. Нажимаем F4 на требуемой таблице и вот она, перед нами:
Любую ячейку мы можем редактировать, нажав F2, отметка «Auto-commit» означает, что после передачи изменений в БД будет автоматически делаться commit. Если отметку снять, то можно будет делать commit и rollback вручную.
При сортировке таблицы (кликайте в имя столбца) изменений в БД не происходит, ибо таблица — это просто результат SELECT *, и если пока вы ее просматриваете, БД изменяется кем-то еще, вы этого не увидите.
Сортировку можно делать по разным столбцам — вначале по одному, потом по другому, а кнопка сброса сортировок (Reset columns order and visibility) появится, если окно достаточно широкое, или вы наведете мышь на двойные угловые скобки слева от настройки Auto-commit.
Нажимаем <Ctrl+F12> или используем Structure Toolwindow (<Alt+7>), и можем выбрать, какие столбцы мы хотим отображать, а какие — нет.
В этом же окне выбора отображается, в каком порядке сортируются столбцы (A — ascending, по возрастанию, D — descending, по убыванию). Если шрифт вашего look and feel позволяет, то вместо A и D вы увидите красивые стрелочки вверх и вниз. Выбирать столбцы для просмотра можно пробелом.
Сортировку можно делать как в таблице на стороне IDE, так и заранее — на стороне базы. Последнее делается кнопкой ORDER BY, а с помощью View Query можно посмотреть, какой именно запрос IDEA отправляет в базу:
Из неочевидных возможностей стоит отметить недавно — в EAP 13-й версии — появившееся транспонирование строк (в IDEA 12 такого не было): если столбцов так много, что строка не умещается на экран, то двойным <Ctrl+Q> ее можно получить в виде столбца, и стрелочками еще бегать вверх-вниз по таблице с длинными строками. С содержимым базы, разумеется, при этом ничего не происходит, оно остается прежним.
Пока что мы работали с Table View базы. Однако поддерживается и режим консоли (нажимаем на значок консоли над tree view в окне Databases):
Теперь мы можем общаться с базой напрямую, отдавая ей SQL-команды, причем в SQL полностью поддерживается знакомый нам autocompletion по <Ctrl+пробел>.
В консольном режиме тоже есть настройка «Auto-commit». Как и раньше, она означает, что после передачи изменений в БД транзакция будет подтверждаться автоматически. Если отметку снять, то справа от нее активируются кнопки для ручного commit и rollback.
Результаты запросов, если таковые ожидаются (например, при SELECT'ах) будут показаны в отдельной таблице внизу экрана, и их можно просматривать также, как и табличное представление базы, вызванное по F4.
Естественно, что с помощью этого плагина можно менять не только значения полей в таблицах, но и структуру таблиц, для этого легко использовать контекстные меню в дереве БД справа.
Если бы поддержкой традиционных БД дело и ограничивалось, то статья на Хабр могла бы и не попасть: в работе с БД с JDBC есть много удобств, но для хабрастатьи не хватало финального аккорда. Аккорд случился осенью 2013-го, когда я пришел к моему коллеге, пишущему всю поддержку Android в JetBrains.
Разработчик под Android легко узнает свои мучения в скриншоте командной строки ниже. Для того, чтобы поработать с базой SQLite на устройстве или эмуляторе напрямую, без приложения, приходится звать adb shell, потом вызывать sqlite3, и просить его открыть базу по адресу, в который входит полное имя пакета приложения. А имя может быть длинным. И autocompletion к adb shell не прилагается.
Поэтому мой визит был жестом отчаяния: даже для того, чтобы сказать DROP DATABASE, когда в таблицах набралось достаточно ненужных тестовых данных, приходилось тратить время на рутинный набор длинных строк.
Любимое дело разработчиков в JetBrains — борьба с рутиной, так что мои горячие просьбы что-нибудь с этим сделать хорошо легли в русло добрых намерений, уже проложенное пятьюдесятью голосами за эту фичу в нашем трекере. Несмотря на тучу других задач, поддержку SQLite в Android допилили за две недели. Решение получилось элегантным: база SQLite вытягивается на компьютер из устройства или эмулятора прозрачно для пользователя, затем с локальной копией можно работать как с обычной БД, а затем ее можно залить в устройство обратно, вызвав Upload из контекстного меню.
Для уверенности в том, что вы работаете с актуальной копией БД, можно синхронизироваться с нею на устройстве, нажав кнопку Syncronize или <Ctrl+Alt+Y>:
В остальном работа с БД при разработке под Android аналогична работе с обычным SQL-сервером.
В заключение остается сказать, что плагин Database Support поддерживает все СУБД, для которых существуют драйверы JDBC (а это практически все популярные СУБД на рынке), и понимает 12 диалектов SQL. Какой именно диалект вы хотите использовать (и иметь соответствующее автодополнение и прочие фишечки к нему), можно указать в настройках IDE: Settings | SQL Dialects.
Рассказ про плагин Database Support будет совершенно неофициальным, я сам его использовал только в веб-разработке и в разработке под Android, но хардкорным разработчикам жесткого enterprise тоже, надеюсь, будет интересно.
История веб-разработчика
Как-то раз мне пришла в голову мысль написать веб-приложение. Был шанс, что нагрузка на него будет довольно высокой и неравномерной, так что я решил в качестве СУБД использовать PostgreSQL в надежде, что она будет работать быстрее привычной MySQL. Сказано — сделано. Прототип написан, база создана, начинаем заполнять таблицы всякой тестовой гадостью.
Через некоторое время становится ясно, что структуру таблиц надо немного подправить, да и тестовые записи в них расплодились — надо чистить. И тут выясняется, что стандартный инструмент ручной работы с PostgreSQL — pgAdmin — совсем не похож на phpMyAdmin, и вообще он — самостоятельное десктопное приложение.
Встает вопрос, есть ли какая-нибудь универсальная штука, которая может работать удобным интерфейсом к БД, причем интерфейсом, внешний вид которого не зависит от БД, с которой он работает?
В JetBrains такую штуку довольно давно придумали, это плагин Database Support, который работает с IntelliJ IDEA Ultimate, RubyMine, PyCharm Professional Edition и PhpStorm. Он довольно сложен в разработке и поддержке, так что в бесплатные IDE он не ставится.
Посмотрим, чем же он нам может помочь. Для начала, настроим его для работы с PostgreSQL. Если у нас на компьютере еще нет драйвера JDBC для PostgreSQL, IDE нам предложит его скачать и установить. В моем случае СУБД запущена на том же компьютере, что и IDE:
Видите вкладку Database по правому краю? Вот при нажатии на нее и открывается окно плагина Database Support (можно его открыть и через View | Tool Windows | Database, и через список окон Tool Windows):
Теперь посмотрим, что же мы можем сделать с его помощью. Во-первых, можно смотреть структуру БД в окне плагина, а если надо вывести UML-диаграмму, то и это можно (нажимаем <Ctrl+Alt+U>). Во-вторых, нам доступны просмотр и редактирование таблиц БД. Нажимаем F4 на требуемой таблице и вот она, перед нами:
Любую ячейку мы можем редактировать, нажав F2, отметка «Auto-commit» означает, что после передачи изменений в БД будет автоматически делаться commit. Если отметку снять, то можно будет делать commit и rollback вручную.
под спойлером - коллаж, одновременно увидеть подсказки Commit и Rollback невозможно, не пытайтесь!
При сортировке таблицы (кликайте в имя столбца) изменений в БД не происходит, ибо таблица — это просто результат SELECT *, и если пока вы ее просматриваете, БД изменяется кем-то еще, вы этого не увидите.
Сортировку можно делать по разным столбцам — вначале по одному, потом по другому, а кнопка сброса сортировок (Reset columns order and visibility) появится, если окно достаточно широкое, или вы наведете мышь на двойные угловые скобки слева от настройки Auto-commit.
Нажимаем <Ctrl+F12> или используем Structure Toolwindow (<Alt+7>), и можем выбрать, какие столбцы мы хотим отображать, а какие — нет.
В этом же окне выбора отображается, в каком порядке сортируются столбцы (A — ascending, по возрастанию, D — descending, по убыванию). Если шрифт вашего look and feel позволяет, то вместо A и D вы увидите красивые стрелочки вверх и вниз. Выбирать столбцы для просмотра можно пробелом.
Сортировку можно делать как в таблице на стороне IDE, так и заранее — на стороне базы. Последнее делается кнопкой ORDER BY, а с помощью View Query можно посмотреть, какой именно запрос IDEA отправляет в базу:
Из неочевидных возможностей стоит отметить недавно — в EAP 13-й версии — появившееся транспонирование строк (в IDEA 12 такого не было): если столбцов так много, что строка не умещается на экран, то двойным <Ctrl+Q> ее можно получить в виде столбца, и стрелочками еще бегать вверх-вниз по таблице с длинными строками. С содержимым базы, разумеется, при этом ничего не происходит, оно остается прежним.
Пока что мы работали с Table View базы. Однако поддерживается и режим консоли (нажимаем на значок консоли над tree view в окне Databases):
Теперь мы можем общаться с базой напрямую, отдавая ей SQL-команды, причем в SQL полностью поддерживается знакомый нам autocompletion по <Ctrl+пробел>.
В консольном режиме тоже есть настройка «Auto-commit». Как и раньше, она означает, что после передачи изменений в БД транзакция будет подтверждаться автоматически. Если отметку снять, то справа от нее активируются кнопки для ручного commit и rollback.
Результаты запросов, если таковые ожидаются (например, при SELECT'ах) будут показаны в отдельной таблице внизу экрана, и их можно просматривать также, как и табличное представление базы, вызванное по F4.
Естественно, что с помощью этого плагина можно менять не только значения полей в таблицах, но и структуру таблиц, для этого легко использовать контекстные меню в дереве БД справа.
История разработчика под Андроид
Если бы поддержкой традиционных БД дело и ограничивалось, то статья на Хабр могла бы и не попасть: в работе с БД с JDBC есть много удобств, но для хабрастатьи не хватало финального аккорда. Аккорд случился осенью 2013-го, когда я пришел к моему коллеге, пишущему всю поддержку Android в JetBrains.
Разработчик под Android легко узнает свои мучения в скриншоте командной строки ниже. Для того, чтобы поработать с базой SQLite на устройстве или эмуляторе напрямую, без приложения, приходится звать adb shell, потом вызывать sqlite3, и просить его открыть базу по адресу, в который входит полное имя пакета приложения. А имя может быть длинным. И autocompletion к adb shell не прилагается.
Поэтому мой визит был жестом отчаяния: даже для того, чтобы сказать DROP DATABASE, когда в таблицах набралось достаточно ненужных тестовых данных, приходилось тратить время на рутинный набор длинных строк.
Любимое дело разработчиков в JetBrains — борьба с рутиной, так что мои горячие просьбы что-нибудь с этим сделать хорошо легли в русло добрых намерений, уже проложенное пятьюдесятью голосами за эту фичу в нашем трекере. Несмотря на тучу других задач, поддержку SQLite в Android допилили за две недели. Решение получилось элегантным: база SQLite вытягивается на компьютер из устройства или эмулятора прозрачно для пользователя, затем с локальной копией можно работать как с обычной БД, а затем ее можно залить в устройство обратно, вызвав Upload из контекстного меню.
Для уверенности в том, что вы работаете с актуальной копией БД, можно синхронизироваться с нею на устройстве, нажав кнопку Syncronize или <Ctrl+Alt+Y>:
В остальном работа с БД при разработке под Android аналогична работе с обычным SQL-сервером.
В заключение остается сказать, что плагин Database Support поддерживает все СУБД, для которых существуют драйверы JDBC (а это практически все популярные СУБД на рынке), и понимает 12 диалектов SQL. Какой именно диалект вы хотите использовать (и иметь соответствующее автодополнение и прочие фишечки к нему), можно указать в настройках IDE: Settings | SQL Dialects.