company_banner

DataGrip 2020.3: SQL для Монги, новые форматы экспорта, интроспекция прав доступа и другое

    Привет! Очередной длинный пост о том, что мы сделали за последние четыре месяца. Как всегда, мы говорим DataGrip, а подразумеваем все остальные наши IDE. В том числе и WebStorm, SQL-плагин к которому теперь можно докупить.




    Самое важное:


    — SQL для MongoDB
    — Поддержка Couchbase
    — Аутентификация через Azure AD
    — Улучшения в редакторе больших значений
    — Открытие таблиц в транспонированном виде
    — Новые форматы экспорта
    — Интроспекция прав доступа
    — Форматирование диалекта Generic
    — Улучшения в конфигурациях запуска
    — Перетаскивание вкладок

    SQL для MongoDB


    Теперь можно писать SQL в MongoDB. Мы написали транслятор SQL в JavaScript.



    Работают только запросы SELECT и предложения JOIN, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, OFFSET. Полный пост обо всём, что мы поддержали, читайте здесь.

    В контекстном меню есть две опции: Copy JS script to clipboard и Show JS Script. Последняя откроет окно с JS-запросом, который мы отправим на сервер. Здесь же можно его отредактировать и запустить.



    Соединение


    Поддержка Couchbase


    Наша семья растёт: мы поддержали Couchbase! Важно отметить, что DataGrip работает с Couchbase Query, а не с Couchbase Analytics.



    Аутентификация через Azure AD


    Об этом нас давно просили: к базе данных Azure SQL теперь можно подсоединиться через Active Directory.



    Рабочая папка


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



    Редактор данных


    Редактор больших значений


    Мы сделали этот редактор в предыдущей версии, а сейчас улучшили несколько вещей.

    Форматированное значение


    Если в ячейке хранится однострочный XML или JSON, в редакторе значений он будет показан в отформатированном виде. Причем вы можете отредактировать значение в удобном виде, а сохранится оно всё равно как одна строка.



    Расположение снизу


    Если вам важна ширина экрана, передвиньте редактор вниз.



    Картинки


    Ещё в этом же редакторе отображаются картинки.



    Открытие таблиц в транспонированном виде


    Теперь все таблицы можно открывать в транспонированном виде по умолчанию. Полезно, если в таблицах много столбцов.



    Выделение в редакторе


    В редакторе всегда работало умное выделение: нажимаете Ctrl+W на Windows/Linux или Opt+Up на macOS и сначала выделяется текущая строка, потом текущий столбец, потом вся таблица. Теперь можно двигаться и в обратном порядке: при помощи Ctrl+Shift+W на Windows/Linux и Opt+Down на macOS.



    Импорт/экспорт


    Новые форматы


    Сделали два новых формата: One-row и SQL-Insert-Multirow.



    One-Row копирует выделенные значения в одну строку через запятую. Это удобно, когда значения столбца нужно вставить в оператор IN.



    SQL-Insert-Multirow сгенерирует один INSERT для нескольких строк. В некоторых базах, например MySQL и PostgreSQL, это работает.



    Не ставить кавычки


    Новая опция в CSV форматах: never quote values.



    Интроспекция


    Сбор диагностической информации


    Интроспекция — это процесс сбора информации о базе данных. Эту информацию DataGrip хранит у себя, чтобы помогать вам навигироваться по базе, искать объекты, дополнять код.

    Иногда при интроспекции обнаруживаются разные проблемы. Мы не всегда можем их воспроизвести. Поэтому мы придумали механизм сбора данных, которые пригодятся, если вы пишете нам в поддержку или трекер.

    Diagnostic refresh запустит интроспекцию, соберет нужную информацию и запишет её в файл, который откроется в файловом менеджере. Он пригодится нам, чтобы понять, что происходит.

    Prepare introspector diagnostic собирает всю возможную информацию, не перезапуская интроспекцию. Результат работы этого действия присылайте, если что-то устарело или не подгрузилось.



    Права доступа


    DataGrip теперь знает о правах доступа и показывает их в сгенерированном DDL для объекта.


    Изменённые объекты в проводнике базы данных


    Если вы изменили DDL объектов, но ещё не успели отправить свои изменения в базу, эти объекты будут подсвечены в дереве. Раньше изменённые объекты показывались только в окне Database Changes.



    [PostgreSQL] Больше свойств таблиц


    DataGrip генерирует DDL таблицы, включая TABLESPACE и INDEX ACCESS METHOD.



    [Greenplum] Новые объекты


    В дереве базы данных Greenplum стало больше отображаемых объектов: мы добавили коллации, материализованные представления, внешние таблицы, обёртки сторонних данных, сторонние сервера, сторонние таблицы и сопоставления пользователей.



    [Oracle] Корректное отображение перегрузок


    Перегрузки внутри одного пакета раньше отображались как один объект. Теперь — как несколько. Число в квадратных скобках — это индекс процедуры в базе данных.



    Помощь в написании кода


    Форматирование диалекта Generic


    Теперь вы можете форматировать запросы, работая с базами, которые мы не поддерживаем.



    Новый интерфейс переименования


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



    Исправление опечаток


    Alt+Enter на Windows/Linux и Opt+Enter на macOSтеперь сразу предлагают список исправлений, без вложенного меню.



    [Oracle] Конфликт вызовов


    Если возникает конфликт вызова перегруженной процедуры, DataGrip предупредит об этом.



    Новые настройки капитализации в форматировании


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



    Запуск запросов


    Конфигурации запуска


    Запуск скриптов из файлов стал удобнее:

    Смена контекста


    DataGrip предупредит, если внутри скрипта меняется контекст, то есть используется USE или SET search_path.



    Отображение контекста


    Если вы выбрали накатить скрипт на источник данных, то DataGrip выберет схему по умолчанию. Теперь она отобразится рядом серым цветом.



    История запуска


    Маленькая кнопка с часами откроет список для выбора баз и схем, на которые вы накатывали скрипты раньше.



    Вывод консоли в отдельной вкладке


    Если для вас важна ширина экрана, вывод консоли можно открывать в новой вкладке окна Services по умолчанию. Таким образом, вся ширина экрана будет задействована для результата запроса или текстового вывода. Включается это в Settings/Preferences | Database | General | Open new services tab for sessions.



    [SQL Server] Имена вкладок


    В прошлом году мы сделали так, что комментарии перед запросом становятся именами вкладок. Это не работало в SQL Server, если запускать сразу несколько запросов, потому что SQL Server обрабатывает несколько запросов как один. Теперь работает как надо.



    [SQL Server] Подсказки для создания индекса в планировщике


    В планировщике теперь появляются подсказки, которые предлагают создать индекс для улучшения производительности запроса.



    Редактирование DDL



    Предупреждение о неактуальной структуре таблицы


    Если вы открываете DDL таблицы, но кэшированная версия DataGrip успела устареть, вас об этом предупредят. Раньше это работало только для объектов с исходным кодом: процедур, функций, представлений.



    Предупреждение, если объект удален


    Если объект был удален, пока вы его редактировали, появится сообщение об этом. Например, вы вносили изменения в процедуру, а в это время её кто-то дропнул!



    DataGrip предложит три варианта:

    Revert local changes: выбирайте этот вариант, если вас устраивает, что процедура удалена. Редактор закроется.

    Keep local changes: в этом варианте вы будете продолжать вносить изменения в процедуру, а при нажатии Submit она будет создана заново.

    Restore in the database: то же самое, но DataGrip сразу же восстановит вариант процедуры, который был актуален на тот момент, когда вы ее открыли. Это нужно для того, чтобы правильно подсветить ваши текущие изменения при редактировании. После нажатия Submit результаты этого действия и Keep local changes будут одинаковы.

    Действия по работе с исходниками


    Действия Submit, Rollback и Show Changes теперь можно запускать для объекта из любого контекста, в том числе проводника. Например, у вас висят изменения для некоторого количества процедур. Можно выделить несколько из них в дереве и только их исходники отправить в базу. А остальные, например, откатить. Раньше эти операции делались только из окна Database Changes.



    Общее


    Перетаскивание вкладок


    Теперь можно переносить вкладки в разные области экрана. Получается, есть и полностью независимый сплит-режим: если выбрать режим In-Editor Results, у каждой вкладки будет свой результат запроса.



    Синхронизация темы с системными настройками


    Если выбрать Sync with OS в настройках Settings/Preferences | Appearance & Behavior | Appearance | Theme, то IDE будет автоматически синхронизировать цветовую тему с настройками операционной системы.



    Сочетания клавиш macOS словами


    Некоторым людям сложно читать условные обозначения клавиш на macOS. Теперь можно дёрнуть ключ ide.macos.disable.native.shortcut.symbols в реестре, и вместо значков будут слова. Сработает для всех меню внутри IDE, кроме главного, в котором поменять что-то мы бессильны.



    Вкладка предпросмотра


    В настройках панели Files выберите Enable Preview Tab. Теперь по клику на файл его содержимое видно во вкладке предпросмотра. Если вы начинаете редактировать файл, эта вкладка превращается в обычную.



    Простой калькулятор


    Вычисляйте несложные штуки в окне Search Everywhere.



    Ассоциации с файлами


    С этой версии в настройках DataGrip можно указать, какие файлы IDE должна открывать по умолчанию. Настройка находится тут: Settings/Preferences | Settings | Editor | File Types | Associate file types with DataGrip.



    Кстати, это могут быть не только файлы, связанные с базами данных. DataGrip — вполне подходящий редактор для JSON, HTML или MarkDown*!

    *с плагином

    Развернуть всё


    Раньше в панелях Database и Files была только кнопка Collapse All, которая закрывает все узлы. Мы добавили кнопку Expand All, которая открывает все возможные узлы до последнего уровня. Может пригодится при быстром поиске, когда вы просто печатаете имя объекта, находясь в дереве. Такой поиск ищет только по открытым узлам.



    Такой вышел релиз!

    Скачать триал на месяц

    Фидбек принимаем в комментариях к посту и здесь:

    Трекер (это если точно нашли проблему)
    Телеграм-канал
    Твиттер
    Почта

    Команда DataGrip
    JetBrains
    Делаем эффективные инструменты для разработчиков

    Комментарии 23

      –4
      сейчас бы в 2020 для монго писать на скл
        +1

        Обалдеть сколько вкусного завезли!
        Отдельное спасибо за форматирование в max view!

          +5

          А поддержка Redis планируется из коробки?

            0
            Периодически обсуждаем и помним, но конкретных планов пока нет.
              +2
              Вот тикет, на который можно подписаться и следить за DataGrip+Redis
              youtrack.jetbrains.com/issue/DBE-283

              * ему уже 6 лет, если чо
              0
              Если в ячейке хранится однострочный XML или JSON, в редакторе значений он будет показан в отформатированном виде. Причем вы можете отредактировать значение в удобном виде, а сохранится оно всё равно как одна строка.

              image


              Этой фичи реально не хватало. DataGrip лучшее что случилось с софтом для DBA

                +1
                Единственная проблема которая останавливает меня от пользования DataGrip была заведена еще 2 года назад — DBE-6807. И судя по статусу до сих пор не решена.
                  +1

                  Поправьте плиз настройки временной зоны, т к таймстемпы отображаются со слона по умолчанию как UTC, хотя сам слон настроен на временную зону Москвы.
                  Долго искали причину таких аномалий-думали может в слоне что.
                  Оказалось в настройках по умолчанию данного IDE почему-то ставится UTC.
                  В бобре и пгадмине таких проблем нет.

                    +2
                    Привет! У этой ситуации очень непростой бэкграунд.

                    1. У PostgreSQL в драйвере JDBC нет возможности узнать дефолтную тайм-зону сервера, которая там хранится в конфиг-файле. Просто нет. На гитхабе можно найти соответствующий тикет с огромной дискуссией. Тикет, кстати, закрыли, хотя делать не стали.
                    github.com/pgjdbc/pgjdbc/issues/576

                    2. Итак, когда DataGrip подключается к базе при помощи jdbc, нужно выставить какую-нибудь тайм-зону. Мы выставляем UTC. Если этого не сделать, то тайм-зона выставится автоматически, и она возьмётся из процесса. То есть, грубо говоря, проставится тайм-зона той машины, откуда запускается DataGrip. Но это еще хуже, чем UTC, потому что пользователь этого не ожидает. У нас раньше именно так и работало и к нам чуть ли не ежедневно приходили пользователи, которые не понимали что происходит. Мы долго думали и решили, что UTC — вариант, вызывающий наименьшее количество проблем.

                    3. Что делать тем, кому UTC не подходит? Выставлять тайм зону явно, для этого мы сделали UI: intellij-support.jetbrains.com/hc/user_images/D0Mif8Q0HMgqWufc0v2FpQ.png

                    4. Как же тогда работает DBeaver, если он тоже использует JDBC? А он-то как раз берет таймзону локальной машины, и ничего не знает про тайм-зону сервера, потому что и не может знать (см пункт один). Просто в вашем случае вы запускаете DBeaver из России, и ваша база имеет ту же таймзону по умолчанию. То есть, это просто совпадение.

                    ИТОГ: Пока в драйвере не сделали возможность узнавать про тайм зону сервера, текущее решение наименее проблемное. А вам надо проставить тайм-зону Москвы во вкладке Options.
                      0

                      Благодарю за развернутый и аргументированный ответ.
                      Однако, если это не специальные поля для обработки, то обычно как раз таки время берется локальное, которое на локальной машине, откуда пошел запрос, а не время сервера.
                      Т е человек делает запись и отображаемое время создания записи ожидается такое, какое было у пользователя на момент создания записи.
                      Для унификации порой вводят ещё одно специальное поле, которое хранит время в формате UTC для последующих обработок с разными временными зонами.
                      Или же вообще хранят все в UTC, а при отображении конвертируют в нужное время, опять же исходя из локальных настроек устройства пользователя, а не сервера. Было бы странным пользователю видеть время сервера.

                        0

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

                          0

                          Да, но так, чтобы не удивлять пользователя (разработчика и аналитика в том числе), т к он хочет видеть свое время локальное.
                          В любом случае решение у бобра самое распространенное и им пользуется очень много людей+он есть бесплатный, есть и платный. Но бесплатного обычно хватает для большинства задач.

                            +1

                            Ну вот я, как разработчик, сильно удивлюсь, если, подключившись к серверу с ЦА в США, увижу локальное время… Какое-нибудь тихоокеанское — нет, UTC — нет, а вот киевское...

                              0

                              Смотря какую задачу решаете
                              Но utc по умолчанию, это 100% не угадать, тогда как локальное время компьютера-как минимум 50% вероятности угадать.
                              И бобром много кто пользуется-если нужно время сервера, можно выставить в настройках для тех, у кого сервер не в их временной зоне или важно время сервера, а не локальное (в большинстве своем в маленьких и средних проектах как раз сервер в той же временной зоне, что и клиенты-даже если вся инфраструктура в облаке где-то в другом месте, то и клиенты и сервера будут там же, потому и будет 50%+ что у клиента, что на сервере один часовой пояс).
                              Потому из соображений юзабилити очень удивился, почему не перенять удачный опыт настроек всем известного в мире бобра

                        +1

                        А как же запрос:
                        SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
                        Который и выводит текущую временную зону.
                        По крайней мере именно так компоненты ИС узнают какая временная зона в слоне.
                        Уверен, что и бобер также узнает, т к сейчас проверил и он возвращает время именно сервера, а не клиента

                          0
                          Это — зона сессии. Возможно, она проставлена явно.
                            0

                            Просто с одного и того же бобра с одной и той же машины на разных слонах выдает разные временные зоны этих слонов.
                            Бобра вообще не настраивал, а второй слон в другой временной зоне, чем мой рабочий комп

                      +1

                      Datagrip ужасно работает с композитными типами в PG.


                      К примеру, Data Extractor генерирует невалидный SQL, который сам помечает ошибочным.


                      Если сделать тип


                      create type public.composite_type as (
                          internal_value varchar[]
                      );

                      И заполнить таблицу какими-то значениями


                      create table public.composite_test (
                          id    bigint                not null,
                          value public.composite_type not null
                      );

                      То Data Extractor сгенерирует такой INSERT, например:


                      insert into public.composite_test (id, value) values (1234, ("{""тест текст 1"",""тест текст 2""}"));
                        0
                        Создайте тикет, пожалуйста: youtrack.jetbrains.com/issues/DBE

                        Ну, или можете сами подправить экстрактор :)
                        0
                        Огромное спасибо за SQL к mongodb!!!
                        При запросе к mongodb порядок полей в результирующей таблице не соответствует порядку указанному в запросе.
                        Более того, если руками переставить в ответе, то после выполнения запроса опять всё переставится в алфавитный порядок…
                          +1
                          Монга просто всегда отдает документ, с полями в алфавитном порядке и _id в начале. То есть, это фича реквест :)
                            0

                            И вообще порядок полей в JSON не определён.

                          0
                          Насколько знаю, вы первые, кто сделал desktop решение для Couchbase. Это очень круто! Они уже у себя на сайте опубликовали подробный tutorial blog.couchbase.com/datagrip-setup-couchbase

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

                          Самое читаемое