Компания
106,98
рейтинг
28 ноября 2013 в 19:31

Разработка → Плагин Database Support в IDE от JetBrains

Даже среди тех, кто давно и активно пользуется 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:

image

Видите вкладку Database по правому краю? Вот при нажатии на нее и открывается окно плагина Database Support (можно его открыть и через View | Tool Windows | Database, и через список окон Tool Windows):

image

Теперь посмотрим, что же мы можем сделать с его помощью. Во-первых, можно смотреть структуру БД в окне плагина, а если надо вывести 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> ее можно получить в виде столбца, и стрелочками еще бегать вверх-вниз по таблице с длинными строками. С содержимым базы, разумеется, при этом ничего не происходит, оно остается прежним.

image

Пока что мы работали с 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, когда в таблицах набралось достаточно ненужных тестовых данных, приходилось тратить время на рутинный набор длинных строк.

image

Любимое дело разработчиков в JetBrains — борьба с рутиной, так что мои горячие просьбы что-нибудь с этим сделать хорошо легли в русло добрых намерений, уже проложенное пятьюдесятью голосами за эту фичу в нашем трекере. Несмотря на тучу других задач, поддержку SQLite в Android допилили за две недели. Решение получилось элегантным: база SQLite вытягивается на компьютер из устройства или эмулятора прозрачно для пользователя, затем с локальной копией можно работать как с обычной БД, а затем ее можно залить в устройство обратно, вызвав Upload из контекстного меню.



Для уверенности в том, что вы работаете с актуальной копией БД, можно синхронизироваться с нею на устройстве, нажав кнопку Syncronize или <Ctrl+Alt+Y>:



В остальном работа с БД при разработке под Android аналогична работе с обычным SQL-сервером.

В заключение остается сказать, что плагин Database Support поддерживает все СУБД, для которых существуют драйверы JDBC (а это практически все популярные СУБД на рынке), и понимает 12 диалектов SQL. Какой именно диалект вы хотите использовать (и иметь соответствующее автодополнение и прочие фишечки к нему), можно указать в настройках IDE: Settings | SQL Dialects.

Автор: @philipto
JetBrains
рейтинг 106,98

Комментарии (33)

  • 0
    Очень удобная штука. Бесконечно выручает, когда надо сделать что-то касающееся схемы базы данных, но лениво лезть в СУБД.
  • 0
    Отличная вещь, только подсветка синтаксиса в запросах плохо работает, когда источников несколько. Либо я не понял, как её натаскать.
    • 0
      Спасибо! А можно чуть подробнее про то, что не работает? Сможете вспомнить, какой запрос подсветился неверно? Хочется разобраться, что и где пошло не так.
      • +1
        Тут дело не в самих запросах. На всякий случай поясню, что я об инъекциях SQL внутри другого языка, и речь о PHPStorm (но ведь это не важно?).

        Ещё раз, может я чего-то недопонял, но если источников несколько, то подсветка не всегда понимает, в каком из них смотреть таблицы. Ситуация такая: один источник уровня IDE, поскольку нужен во всех проектах; другой только уровня проекта. Запросы идут по разным схемам, и иногда плагин не понимает, к какому из источников относятся таблицы, и подсвечивает их, как неопознанные. Исправить можно наверняка, запустив запрос с указанием подключения. А иногда после пары синхронизаций проблема решается сама.

        Ах да, ещё эта штука не знает про служебные таблицы Oracle, обидно :)
        • 0
          Понятно. Уточним утром у разработчиков плагина. А насчет служебных таблиц — это случайно не то же самое, о чем вот тут пишут: stackoverflow.com/questions/4832056/java-jdbc-how-to-connect-to-oracle-using-service-name-instead-of-sid/6047081#6047081
          • 0
            Спасибо!

            Нет, вроде не имеет никакого отношения. Служебными таблицами я ошибочно назвал вьюхи dba, all, user и v$ (http://www.dba-oracle.com/concepts/data_dictionary.htm). При подсветке синтаксиса плагин точно так же про них не знает, хотя они есть всегда и даже их структура по идее заведомо известна.
            • 0
              Ага, это уже лучше. Создайте про это issue, пожалуйста!
              • 0
                Оказалось, тикет был создан ещё в 2009: «SQL: Oracle: static data dictionary views could be resolved» (http://youtrack.jetbrains.com/issue/IDEA-47370). Проголосовал за него.
        • 0
          Я тут прошу создать issue про таблицы Oracle, с ними проще. А насчет нескольких источников есть уже подобный issue, мы пока думаем, как это сделать лучше. Если проголосуете за него, результаты наших раздумий будут приходить к вам в виде нотификаций из трекера.
  • +1
    Это Лучший плагин для Idea!
  • 0
    Пользуюсь Штормом уже несколько лет, но так и не начал использовать Database Support, так как когда пытался это, не мог найти отключение кеширования/чтения всей схемы БД. Дело в том, что если БД перегружено базами и таблицами, как например бывает с девелоперским окружением, когда в отличии от продакшена на одном сервере может валяться слишком много баз, то плагин пытался нереально долго прочесть все базы и таблицы и моего терпения не хватало. Стоит ли пробовать этот плагин снова? Может я подслеповат и опция такая была всегда или ее добавили?
    • +2
      При добавлении Data Source на вкладке Schemas & Tables можно выбрать какие таблицы синхронизировать. Оно?
  • 0
    Пытался настроить этот плагин, но ничего не вышло. В нашем проекте таблицы имеют префикс — две латинские бквы и знак доллара, плагин почему-то упорно не хочет их показывать в списке. Таблицы без префикса показываются.
    • 0
      Проголосуйте, пожалуйста, за youtrack.jetbrains.com/issue/IDEA-116315. Проблему решить реально, и у вас в проекте все начнет работать, как полагается.
      • 0
        Спасибо за ссылку, проголосовал
  • +2
    Спасибо за полезную статью, но… Я, конечно, все понимаю, тестовые данные, все дела. Но пароли в открытом виде в БД? Еще и в проекте, в названии которого присутствует слово invoice? Скажите, что вы не планировали так делать и это просто тестовые данные получились подозрительно непохожими на хеши. :)
    • +4
      )) код и данные на скриншотах, как вы верно догадываетесь, никак не связаны с проектами JetBrains. И даже вообще не связаны ни с какими проектами. Это такая штука, на которой можно тренироваться, как на глиняных (я не ошибаюсь, глиняных?) кошках в известной комедии. Хорошо, что вы заметили полосочки на хвосте, и вообще плюс вам за внимательность. Разумеется, статью ни в коем случае не следует понимать как совет хранить пароли clear text'ом даже там, где слово invoice не присутствует.

      Да, и едва не забыл добавить: все совпадения названий, цифр и знаков препинания внутри таблиц — случайны и приведены только для развлечения почтенной публики!
  • +1
    Можете сказать что-нибудь о поддержке плейсхолдеров в sql запросах? Мне очень нравится автоматическое дополнение имён полей и таблиц, но я не могу при этом отключить ошибки, вызванные плейсхолдерами.

    Вот старый тикет: youtrack.jetbrains.com/issue/IDEA-106288
    Почему нельзя хотя бы добавить настройку инспекции? Сейчас невозможно отключить отображение ошибок в SQL. Приходится использовать режим «keywords only».
  • 0
    Мне всего лишь mysql обычно нужен и тут меня полностью устраивает в качестве гуя маковский SequelPro (хотя автодополнение при написании запросов там никакущее).

    А вот с pgadmin пробовал работать — невероятно неудобная штука.
  • 0
    То есть, чтобы пофиксили, например, вот этот 6-летний баг, нужно самолично явиться в офис JetBrains с плеткой?
    ps. Хоть он и создан как feature, но это реально баг, ну зачем подсвечивать даже незначительные ошибки в diff'е?
    • +1
      Issue обновили, похоже в версии 13.1 исправят, спасибо ;)
  • 0
    а в AppCode оно похоже недоступно, пригодилось бы для ковыряний в SQLite-базах.
    • 0
      Пока у пользователей AppCode, похоже, оно мало востребовано. Тех, кому оно нужно, призываю голосовать за соответствующее issue. Что-то в этом топике призывов к голосованию больше обычного, то ли мы за год мало пофиксили, то ли все мало голосовали…
      • 0
        Подправьте тогда пожалуйста страничку, наличие там иконки AppCode вводит в заблуждение.
        • 0
          спасибо большое, исправим обязательно!
  • 0
    Для H2 мне показалось мало юзабельно. Создание таблицы чисто через гуй не реально выполнить.
  • 0
    Я очень люблю PyCharm и пользуюсь им уже 3 года, но вот настроить этот плагин не могу до сих пор :(

    Передаю привет Navicat Premium.
    • 0
      Спасибо за доброе слово ) А отчего плагин настроить не можете? Что пошло не так? Просто времени не было?
      • 0
        Да, не было времени, плюс не понятно как установить драйверы для баз глобально с их автоматическим «подсасыванием» при выборе типа базы.
        Перефразируя — почему бы не устанавливать драйвера в автоматическом режиме?
        • 0
          У меня вроде как автоматически с PostgreSQL и получилось. И с SQLite тоже. Если с какими-то драйверами не выходит — пишите сюда или в трекер, проверим.
          • 0
            Это у вас винда потому что :)
            А в Макоси — нет.
            • 0
              на Linux, если мне не изменяет память, тоже «подсасывание» автоматическое было — сейчас проверить не могу, т.к. вот уже год как на Windows вернулся
  • 0
    Ещё хороший плагин консоли для Hibernate, позволяющий протестировать HQL-запросы и посмотреть что реально получится на «выхлопе» в SQL запросе.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка