RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 3. Использование MySQL как хранилища документов

Эта глава показывает альтернативный способ работать с MySQL как с хранилищем документа, иногда называемый NoSQL. Если Ваше намерение состоит в том, чтобы использовать MySQL традиционным способом (SQL), эта глава, вероятно, не относится к Вам.

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

Эти разделы описывают использование MySQL как хранилища документов:

  • Раздел 3.2 покрывает такие понятия, как документ, набор, сеанс и схема, чтобы помочь Вам понять, как использовать MySQL в качестве хранилища документов.

  • Раздел 3.3 объясняет, как сконфигурировать X Plugin на сервере MySQL таким образом, что это сможет функционировать как хранилище документа, и как установить MySQL Shell, чтобы использовать в качестве клиента.
  • MySQL Shell является интерактивным интерфейсом к MySQL с поддержкой JavaScript, Python или режимов SQL. Вы можете использовать MySQL Shell для приложений опытного образца, выполнить запросы и обновить данные.

  • Раздел 3.8 обеспечивает более подробную информацию об использовании MySQL Shell.
  • Руководство пользователя X DevAPI.

    Клиенты, которые общаются с сервером MySQL, используя X Protocol, могут использовать X DevAPI, чтобы разработать приложения. Например MySQL Shell и MySQL Connectors обеспечивают это, реализуя X DevAPI. X DevAPI предлагают современный программный интерфейс, который оказывает поддержку для установленных понятий промышленного стандарта. См. X DevAPI User Guide.

  • Следующие MySQL Connector поддерживают X Protocol и позволяют Вам использовать X DevAPI на выбранном языке, чтобы разработать приложения, которые общаются с сервером MySQL, функционирующим как хранилище документов.

    Каждая реализация X DevAPI обеспечивает ссылочную документацию библиотеки, доступную по вышеупомянутым ссылкам.

3.1. Состояние подготовки (официальное уведомление)

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

3.2. Ключевые понятия

Этот раздел объясняет понятия, введенные как часть использования MySQL как хранилища документов.

Документ

Документ набор пар ключей и значений, как представлено объектом JSON. Документ представлен, внутренне используя двоичный JSON-объект MySQL через тип данных JSON MySQL. Значения полей могут содержать другие документы, массивы и списки документов.

{"GNP": .6, "IndepYear": 1967, "Name": "Sealand", "_id": "SEA",
 "demographics": {"LifeExpectancy": 79, "Population": 27},
 "geography": {"Continent": "Europe", "Region": "British Islands",
               "SurfaceArea": 193},
 "government": {"GovernmentForm": "Monarchy", "HeadOfState": "Michael Bates"}
}

Набор

Набор это контейнер, который может использоваться, чтобы хранить документы в базе данных MySQL.

Операции CRUD

Операции Create, Read, Update и Delete (CRUD) четыре основных операции, которые могут быть выполнены на наборе базы данных или таблице. С точки зрения MySQL это означает:

  • Создание новой записи (вставка или дополнение).

  • Чтение записи (запрос).
  • Обновление записи.
  • Удаление записи.

X Plugin

Плагин сервера MySQL, который включает коммуникации, используя X Protocol. Клиенты, которые осуществляют X DevAPI и позволяют Вам использовать MySQL в качестве хранилища документов.

X Protocol

Протокол, чтобы общаться с сервером MySQL, выполняющим X Plugin. X Protocol поддерживает операции CRUD и SQL, аутентификацию через SASL, позволяет передавать поток команд (конвейерная обработка) и расширяем.

3.3. Установка MySQL как хранилища документов

Этот раздел описывает, как установить X Plugin, чтобы позволить серверу MySQL использовать X Protocol и MySQL Shell, чтобы действовать как клиент.

Предпосылкой для того, чтобы использовать MySQL в качестве хранилища документов являются X Plugin, который осуществляет X Protocol. Без работающего X Plugin клиенты X Protocol не могут соединиться с сервером. X Plugin поставляется вместе с сервером MySQL.

Настройка MySQL как хранилища документов:

  1. Установить MySQL 8 или обновиться с версии MySQL 5.7.12 или ниже.

    Когда установка или апгрейд сделаны, запустите сервер. Для инструкций относительно запуска сервера, см. раздел 2.9.2.

    MySQL Installer позволяет Вам выполнить этот и следующий шаги в то же самое время для новых установок на Microsoft Windows. На экране Plugin and Extensions отметьте галочку Enable X Protocol/MySQL as a Document Store. После установки проверьте, что X Plugin установлен.

  2. Установка X Plugin. Не-root пользователь может использоваться, чтобы установить плагин, пока учетная запись имеет привилегию INSERT на таблице mysql.plugin.

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

    • Используйте MySQL Installer for Windows:

      1. Запустите MySQL Installer for Windows. Откроется инструментальная панель MySQL Installer.

      2. Кликните Reconfigure для сервера MySQL. Используйте Next и Back, чтобы сконфигурировать следующие элементы:

        • В Accounts and Roles подтвердите текущий пароль для пользователя root.

        • В Plugin and Extensions проверьте наличие галочки Enable X Protocol/MySQL as a Document Store. MySQL Installer обеспечивает номер порта по умолчанию и открывает порт брандмауэра для сетевого доступа.
        • В Apply Server Configuration кликните Execute.
        • Кликните Finish, чтобы закрыть MySQL Installer.

      3. Установить MySQL Shell.

    • Использовать MySQL Shell:

      1. Установите MySQL Shell.

      2. Откройте окно терминала (командная строка в Windows) и переместитесь к местоположению MySQL (например, /usr/bin/ в Linux).
      3. Выполните следующую команду:
        mysqlsh -u user -h localhost --classic --dba enableXProtocol
        
    • Используя программу MySQL Client:

      1. Откройте окно терминала (командная строка в Windows) и переместитесь к местоположению MySQL (например, /usr/bin/ в Linux).

      2. Вызовите mysql :
        mysql -u user -p
        
      3. Сделайте в нем следующее:

        mysql> INSTALL PLUGIN mysqlx SONAME 'mysqlx.so';
        
        Замените mysqlx.so на mysqlx.dll для Windows.
      4. Установите MySQL Shell.

  3. Проверьте, что X Plugin установлен.

    Когда X Plugin установлен должным образом, он обнаруживается в списке, когда Вы запрашиваете активные плагинов на сервере одной из следующих команд:

    • MySQL Shell:

      mysqlsh -u user --sqlc -e "show plugins"
      
    • MySQL Client:

      mysql -u user -p -e "show plugins"
      

    Если Вы сталкиваетесь с проблемами с установкой X Plugin или хотите узнать об альтернативных способах установки, конфигурирования или удаления плагинов сервера, см. раздел 6.6.2.

Учетная запись пользователя mysqlxsys@localhost

Установка X Plugin создает учетную запись пользователя mysqlxsys@localhost. Если создание учетной записи пользователя терпит неудачу, установка X Plugin также проваливается.

Процесс установки X Plugin использует пользователя MySQL root , чтобы создать внутреннюю учетку для пользователя mysqlxsys@localhost. Эта запись mysqlxsys@localhost используется X Plugin для аутентификации внешних пользователей и для того, чтобы уничтожить сеансы, когда это затребовано привилегированным пользователем. Запись mysqlxsys@localhost создается как заблокированная, таким образом, она не может использоваться, чтобы войти в систему внешними пользователями. Если по некоторым причинам MySQL root недоступен прежде, чем Вы запустите установку X Plugin, Вы должны вручную создать пользователя mysqlxsys@localhost, делая следующие запросы в клиенте mysql:

CREATE USER IF NOT EXISTS mysqlxsys@localhost IDENTIFIED WITH
       mysql_native_password AS 'password' ACCOUNT LOCK;
GRANT SELECT ON mysql.user TO mysqlxsys@localhost;
GRANT SUPER ON *.* TO mysqlxsys@localhost;

Удаление X Plugin

Если Вы когда-либо захотите удалить (дезактивировать) X Plugin, сделайте следующее в клиенте mysql:

UNINSTALL PLUGIN mysqlx;
Не используйте MySQL Shell, чтобы сделать это. Сработает, но Вы получите ошибку (код 1130). Кроме того, удаление плагина удаляет и пользователя mysqlxsys.

3.3.1. Установка MySQL Shell

Этот раздел описывает, как загрузить, установить и запустить MySQL Shell, который является интерактивным интерфейсом JavaScript, Python или SQL, поддерживающим разработку и администрирование. MySQL Shell это компонент, который Вы можете установить отдельно.

Требования

MySQL Shell доступен на Microsoft Windows, Linux, и OS X. MySQL Shell требует, чтобы встроенный X Plugin был активным. Вы можете установить плагин сервера прежде или после того, как Вы устанавливаете MySQL Shell.

3.3.1.1. Установка MySQL Shell в Microsoft Windows

Чтобы установить MySQL Shell на Microsoft Windows, используя MSI Installer, сделайте следующее:

  1. Скачайте Windows (x86, 64-bit) MSI Installer с http://dev.mysql.com/downloads/shell/.

  2. Щелкните по Run.
  3. Следуйте шагам в Мастере установки программного обеспечения.

    Рис. 3.1. Установка MySQL Shell в Windows.

    Установка MySQL Shell в Windows

    Если Вы установили MySQL, не включая X Plugin, а позже решили, что Вы хотите установить X Plugin, или если Вы устанавливаете MySQL, не используя установщик MySQL, см. этот раздел.

    3.3.1.2. Установка MySQL Shell в Linux

    Пакеты установки для MySQL Shell доступны только для ограниченного количества дистрибутивов Linux и только для 64-битных систем.

    Для поддерживаемых дистрибутивов Linux самый легкий способ установить MySQL Shell это использовать репозитарии MySQL APT repository или MySQL Yum repository. Для систем, не использующих репозитарии MySQL, MySQL Shell может также быть загружен и установлен непосредственно.

    Установка MySQL Shell из репозитария MySQL APT

    Установка MySQL Shell из репозитария MySQL APT поддерживается только на Ubuntu 14.04 LTS (Trusty Tahr) и Ubuntu 15.10 (Wily Werewolf).

    Для них надо выполнить следующее:

    • Если у Вас еще нет MySQL APT repository как репозитария программного обеспечения в Вашей системе, сделайте следующее:

      • Следуйте за шагами, данными в Adding the MySQL APT Repository, обращая особое внимание на следующее:

        • Во время установки пакета конфигурации, когда в диалоговом окне надо сконфигурировать репозитарий, удостоверьтесь, что Вы выбираете MySQL 5.7 (который является опцией по умолчанию) как ряд выпуска, который Вы хотите использовать, и включаете компонент MySQL Preview Packages.

        • Удостоверьтесь, что Вы не пропускаете шаг для того, чтобы обновить информацию о пакете для MySQL APT:
          sudo apt-get update
          
      • Установите MySQL Shell этой командой:

        sudo apt-get install mysql-shell
        
    • Если у Вас уже есть MySQL APT repository как репозитарий программного обеспечения в Вашей системе, сделайте следующее:

      • Обновите информацию о пакете для MySQL APT:

        sudo apt-get update
        
      • Обновите пакет конфигурации репозитария следующей командой:

        sudo apt-get install mysql-apt-config
        
        Когда в диалоговом окне надо сконфигурировать репозитарий, удостоверьтесь, что Вы выбираете MySQL 5.7 (который является опцией по умолчанию) как ряд выпуска, который Вы хотите использовать, и включаете компонент MySQL Preview Packages.
      • Установите MySQL Shell:
        sudo apt-get install mysql-shell
        
    Установка MySQL Shell с MySQL Yum Repository

    Установка MySQL Shell с MySQL Yum repository поддерживается только на EL6 и EL7-основанных системах, а также на Fedora 23 и 24.

    Для версий Linux, поддерживаемых MySQL Yum repository, установите MySQL Shell так:

    • Сделайте одно из следующего:

      • Если у Вас уже есть MySQL Yum repository как репозитарий программного обеспечения в Вашей системе, и репозитарий был сконфигурирован с новым пакетом выпуска mysql57-community-release, переходите к следующему шагу.

      • Если Вы уже имеете MySQL Yum repository как репозитарий программного обеспечения в Вашей системе, но сконфигурировали репозитарий со старым пакетом выпуска mysql-community-release, проще всего установить MySQL Shell, сначала реконфигурировав репозитарий с новым пакетом mysql57-community-release. Чтобы сделать это, Вы сначала должны удалить свой старый пакет выпуска следующей командой:
        sudo yum remove mysql-community-release
        
        Для dnf-систем сделайте так:
        sudo dnf erase mysql-community-release
        
        Теперь следуйте шагам, данным в Adding the MySQL Yum Repository, чтобы установить новый пакет выпуска mysql57-community-release.
      • Если Вы еще не имеете MySQL Yum repository как репозитарий программного обеспечения в Вашей системе, следуйте шагам, данным в Adding the MySQL Yum Repository.

    • Включите подрепозитарий MySQL Tools Preview. Вы можете сделать это редактируя вручную файл /etc/yum.repos.d/mysql-community.repo. Это пример значения по умолчанию подрепозитария в файле (запись baseurl в Вашем файле может выглядеть по-другому, в зависимости от Вашего дистрибутива Linux):

      [mysql-tools-preview]
      name=MySQL Tools Preview
      baseurl=http://repo.mysql.com/yum/mysql-tools-preview/el/6/$basearch/
      enabled=0
      gpgcheck=1
      gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
      
      Исправьте запись enabled=0 на enabled=1, чтобы включить репозитарий.
    • Установите MySQL Shell:
      sudo yum install mysql-shell
      
      Для dnf-систем установите так:
      sudo dnf install mysql-shell
      
    Установка MySQL Shell прямой загрузкой с MySQL Developer Zone

    RPM, Debian и пакеты исходных текстов для того, чтобы установить MySQL Shell также доступны для скачивания с Download MySQL Shell.

    3.3.1.3. Установка MySQL Shell в OS X

    Чтобы поставить MySQL Shell в OS X, сделайте так:

    1. Загрузите пакет с http://dev.mysql.com/downloads/shell/.

    2. Сделайте двойной клик на загруженном DMG, чтобы установить это. Откроется Finder.
    3. Сделайте двойной клик на файле .pkg в окне Finder.
    4. Следуйте шагам в мастере установки.

      Рис. 3.2. Установка MySQL Shell в OS X

      Установка MySQL Shell в OS X
    5. Когда установщик закончит работу, удалите DMG (он может быть удален).

    3.3.2. Запуск MySQL Shell

    Вы нуждаетесь в имени учетной записи и пароле, чтобы установить использование сеанса MySQL Shell. Замените user Вашим именем учетной записи.

    На той же самой системе, где работает сервер, откройте окно терминала (командная строка в Windows) и запустите MySQL Shell следующей командой:

    mysqlsh --uri user@localhost
    
    Вы будете запрошены о пароле, а затем это устанавливает X Session.

    3.4. MySQL Shell для JavaScript

    Это руководство по быстрому старту обеспечивает инструкции, чтобы создать прототип приложения базы данных в интерактивном режиме с MySQL Shell. Руководство включает следующие темы:

    • Введение в функциональность MySQL, MySQL Shell и образец базы данных world_x.

    • Операции, чтобы управлять наборами и документами.
    • Операции, чтобы управлять реляционными таблицами.
    • Операции, которые относятся к документам в пределах таблиц.

    Больше примеров по использованию X DevAPI есть в X DevAPI User Guide.

  4. 3.4.1. Введение

    В MySQL таблицы нативный тип контейнера хранения данных, наборы хранятся, внутренне используя таблицы.

    JSON-документы и наборы

    В JSON документом является структура данных, составленная из пар поле/значение, сохраненных в пределах набора. Значения полей часто содержат другие документы, массивы и списки документов.

    {"GNP": .6, "IndepYear": 1967, "Name": "Sealand", "_id": "SEA",
     "demographics": {"LifeExpectancy": 79, "Population": 27},
     "geography": {"Continent": "Europe", "Region": "British Islands",
                   "SurfaceArea": 193},
     "government": {"GovernmentForm": "Monarchy", "HeadOfState": "Michael Bates"}
    }
    

    Реляционные таблицы

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

    +----+----------------+-------------+-----------------+------------------------+
    | ID | Name           | CountryCode | District        | Info                   |
    +----+----------------+-------------+-----------------+------------------------+
    |1   | Kabul| AFG     | Kabol       |                  {"Population": 1780000} |
    |2   | Qandahar       | AFG         | Qandahar        |{"Population": 237500}  |
    |3   | Herat| AFG     | Herat       |                  {"Population": 186800}  |
    |4   | Mazar-e-Sharif | AFG         | Balkh           |{"Population": 127800}  |
    |5   | Amsterdam      | NLD         | Noord-Holland   |{"Population": 731200}  |
    |6   | Rotterdam      | NLD         | Zuid-Holland    |{"Population": 593321}  |
    +----+----------------+-------------+-----------------+------------------------+
    

    3.4.2. Образец базы данных

    Образец базы данных world_x содержит некий набор JSON и 3 реляционных таблицы:

    • Набор

      • countryinfo: информация о странах в мире.

    • Таблицы

      • country: минимальная информация о странах мира.

      • city: информация о некоторых из городов в странах.
      • countrylanguage: языки, на которых говорят в каждой стране.

    Требования

    Вы должны установить MySQL Shell с X Protocol. Для инструкций см. раздел 3.3.

    Запустите сервер прежде, чем Вы загрузите базу данных world_x для этого руководства.

    Загрузка базы данных world_x

    Чтобы подготовить образец базы данных world_x, следуйте этим шагам:

    1. Скачайте world_x-db.zip.

    2. Извлеките архив установки во временный каталог, например, в /tmp/. Распаковка архива приводит к единственному файлу world_x.sql.
    3. Создайте или обновите схему следующей командой:
      mysqlsh -u root --sql --recreate-schema world_x < /tmp/world_x-db/world_x.sql
      Enter password: ****
      Recreating schema world_x...
      
      Введите свой пароль когда надо. Не-root учетная запись может использоваться, если у нее записи есть привилегии создавать новые базы данных.

      Замените /tmp/ на путь к файлу world_x.sql в Вашей системе.

    3.4.3. MySQL Shell

    MySQL Shell является объединенным интерфейсом скриптов для сервера MySQL. Это поддерживает скрипты на JavaScript и Python. JavaScript режим обработки по умолчанию. В большинстве случаев Вы нуждаетесь в учетной записи, чтобы соединиться с местным сервером MySQL.

    Запуск MySQL Shell

    После того, как Вы установили и запустили сервер MySQL, соединитесь с сервером. По умолчанию MySQL Shell соединяется, используя X Protocol.

    На той же самой системе, где работает сервер, откройте окно терминала и запустите MySQL Shell следующей командой:

    mysqlsh -u name world_x
    Creating an X Session to name@localhost:33060/world_x
    Enter password: ****
    
    Вы, возможно, должны определить другой путь, соответственно своей системе.

    Кроме того:

    • name представляет имя пользователя Вашей учетной записи MySQL.

    • MySQL Shell запросит его пароль.
    • Схема по умолчанию для этого сеанса: база данных world_x.

    Подсказка mysql-js> указывает, что активный язык для этого сеанса JavaScript:

    mysql-js>
    
    Когда Вы выполняете mysqlsh без параметра host, MySQL Shell пытается соединиться с сервером по адресу localhost на порту 33060. Чтобы определить иной хост или номер порта, как и другие опции, см. описания опций на mysqlsh The MySQL Shell.

    MySQL Shell поддерживает входную строку, редактируемую следующим образом:

    • Клавиши стрелка влево и стрелка вправо перемещают горизонтально в пределах текущей входной строки.

    • Клавиши стрелка вверх и стрелка вниз перемещают вверх и вниз по набору ранее введенных строк.
    • Backspace и Enter действуют как и везде.

    Получение справки по MySQL Shell

    Введите mysqlsh --help на подсказку Вашего интерпретатора команд для получения списка параметров командной строки.

    mysqlsh --help
    
    Введите \help на подсказку MySQL Shell для получения списка доступных команд и их описания.
    mysql-js> \help
    
    Введите \help и имя команды для получения подробной справки о команде MySQL Shell. Например, чтобы посмотреть справку по команде \connect, введите:
    mysql-js> \help \connect
    

    Выход из MySQL Shell

    Чтобы выйти из MySQL Shell, введите следующую команду:

    mysql-js> \quit
    

    3.4.4. Документы и наборы

    В MySQL наборы содержат документы JSON, которые Вы можете добавить, найти, обновить и удалить. Наборы это контейнеры в пределах схемы, которую Вы создаете, просматриваете и удаляете.

    Примеры в этом разделе используют набор countryinfo в базе данных world_x.

    Документы

    В MySQL представлены документы как JSON-объекты. Внутренне они сохранены в эффективном двоичном формате, который включает быстрый поиск и обновления.

    • Простой формат документа для JavaScript:

      {field1: "value", field2 : 10, "field 3": null}
      

    Массив документов состоит из ряда документов, отделенных запятыми и заключенный в символы [ и ].

    • Простой массив документов для JavaScript:

      [{Name: "Aruba", _id: "ABW"}, {Name: "Angola", _id: "AGO"}]
      

    MySQL поддерживает следующие типы значения JavaScript в документах JSON:

    • Числа (целое число и с плавающей запятой).

    • Строки.
    • boolean (false и true).
    • null.
    • Массивы большего количества значений JSON.
    • Вложенные (или встроенные) объекты большего количества значений JSON.

    Наборы

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

    Термин "схема" эквивалентен "базе данных", что означает группу объектов базы данных (в противоположность реляционной схеме, используемой, чтобы провести в жизнь структуру и ограничения по данным). Схема не проводит в жизнь соответствие документов в наборе.

    • Основные объекты включают:

      ОбъектОписание
      dbdb глобальная переменная, назначенная текущей активной схеме, которую Вы определили в командной строке. Вы можете ввести db в MySQL Shell, чтобы напечатать описание объекта, который в этом случае будет названием схемы, которую это представляет.
      db.getCollections() db.getCollections() хранит список наборов в схеме. Используйте список, чтобы получить ссылки на объекты набора.
    • Основные операции над наборами включают:

      Операция Операция
      db.name.add() Метод add() вставляет один документ или список документов в названный набор.
      db.name.find() find() возвращает некоторые или все документы в названном наборе.
      db.name.modify() modify() обновляет документы в названном наборе.
      db.name.remove() remove() удаляет один документ или список документов из названного набора.

    Соответствующая информация

    3.4.4.1. Создание, просмотр и удаление наборов

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

    Подтверждение схемы

    Чтобы показать значение, которое назначено переменной схемы, введите db:

    mysql-js> db
    <Schema:world_x>
    
    Если значение схемы не Schema:world_x, установите переменную db следующим образом:
    mysql-js> \use world_x
    Schema `world_x` accessible through db.
    
    Создание наборов

    Чтобы создать новый набор в существующей схеме, используйте метод createCollection().

    Следующий пример создает в базе данных world_x набор flags. Метод возвращает объект набора.

    mysql-js> db.createCollection("flags")
    <Collection:flags>
    
    Просмотр наборов

    Чтобы вывести на экран все наборы в базе данных world_x используйте метод getCollections() на объекте схемы. Наборы, возвращенные сервером, появляются между скобками.

    mysql-js> db.getCollections()
    [
    <Collection:countryinfo>,
    <Collection:flags>
    ]
    
    Удаление набора

    Чтобы удалить существующий набор из базы данных, используйте метод dropCollection() на объекте сеанса. Например, чтобы исключить набор flags из базы данных world_x, скомандуйте:

    mysql-js> session.dropCollection("world_x", "flags")
    Query OK (0.04 sec)
    

    3.4.4.2. Добавление документов

    Вы можете использовать метод add(), чтобы вставить один документ или список документов в существующий набор MySQL Shell. Все примеры в этом разделе используют набор countryinfo.

    Добавление документа

    Вставьте следующий документ в набор countryinfo. Нажмите Enter дважды, чтобы вставить документ.

    mysql-js> db.countryinfo.add(
     {GNP: .6, IndepYear: 1967, Name: "Sealand", _id: "SEA",
      demographics: {LifeExpectancy: 79, Population: 27},
      geography: {Continent: "Europe", Region: "British Islands",
                  SurfaceArea: 193},
      government: {GovernmentForm: "Monarchy",
      HeadOfState: "Michael Bates"}
     }
    )
    Query OK, 1 item affected (0.02 sec)
    
    Метод возвращает состояние операции.

    Каждый документ требует поле идентификатора _id. Значение поля _id должно быть уникальным среди всех документов в том же самом наборе. Если документ передан методу add() без поля _id, MySQL Shell автоматически вставляет поле в документ и устанавливает значение в произведенный универсальный уникальный идентификатор (UUID).

    3.4.4.3. Поиск документов

    Вы можете использовать метод find(), чтобы запросить документы из набора в базе данных. MySQL Shell обеспечивает дополнительные методы, чтобы фильтровать и сортировать возвращенные документы.

    MySQL предоставляет следующие операторы, чтобы определить условия поиска: OR (||), AND (&&), XOR, IS, NOT, BETWEEN, IN, LIKE, !=, <>, >, >=, <, <=, &, |, <<, >>, +, -, *, /, ~ и %.

    Поиск всех документов в наборе

    Чтобы возвратить все документы в наборе, используйте метод find(), не определяя условия поиска. Например, следующий запрос возвращает все документы в наборе countryinfo.

    mysql-js> db.countryinfo.find()
    [{"GNP": 828, "IndepYear": null, "Name": "Aruba", "_id": "ABW",
      "demographics": {"LifeExpectancy": 78.4000015258789,
                       "Population": 103000},
      "geography": {"Continent": "North America", "Region": "Caribbean",
                    "SurfaceArea": 193},
      "government": {"GovernmentForm": "Nonmetropolitan Territory of The Netherlands",
                     "HeadOfState": "Beatrix"}
      ...
    }]
    240 documents in set (0.00 sec)
    
    Метод приводит к результатам, которые содержат операционную информацию в дополнение ко всем документам в наборе.

    Пустой набор (никакие документы не подошли) возвращает следующую информацию:

    Empty set (0.00 sec)
    
    Фильтрованный поиск

    Вы можете включать условия поиска в метод find(). Синтаксис для выражений, которые формируют условие поиска, является тем же самым, как и для традиционного MySQL. Вы должны указать все выражения в кавычках.

    Все примеры в этом разделе используют набор countryinfo в базе данных world_x. Ради краткости некоторые из примеров не выводят на экран вывод.

    Простое условие поиска состоит из поля _id и уникального идентификатора документа. Следующий пример возвращает единственный документ, соответствующий строке идентификатора:

    mysql-js> db.countryinfo.find("_id = 'AUS'")
    [{"GNP": 351182, "IndepYear": 1901, "Name": "Australia", "_id": "AUS",
      "demographics": {"LifeExpectancy": 79.80000305175781,
                       "Population": 18886000},
      "geography": {"Continent": "Oceania",
                    "Region": "Australia and New Zealand",
      "SurfaceArea": 7741220},
      "government": {"GovernmentForm": "Constitutional Monarchy, Federation",
                     "HeadOfState": "Elisabeth II"}
    }]
    1 document in set (0.01 sec)
    
    Следующий пример ищет все страны, у которых есть GNP выше, чем $500 миллиардов. countryinfo набор измеряет GNP в миллионах.
    mysql-js> db.countryinfo.find("GNP > 500000")
    ...[output removed]
    10 documents in set (0.00 sec)
    
    Поле Population в следующем запросе встроена в объект demographics. Чтобы получить доступ к встроенной области, используйте период между demographics и Population, чтобы идентифицировать отношения. Имена документов и полей являются чувствительными к регистру.
    mysql-js> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000")
    ...[output removed]
    6 documents in set (0.00 sec)
    
    Арифметические операторы в следующем выражении используются, чтобы запросить страны с GNP на душу населения выше, чем 30000$. Условия поиска могут включать арифметические операторы и большинство функций MySQL.

    У семи документов в наборе countryinfo есть значение населения 0. Предупреждающие сообщения появляются в конце вывода.

    mysql-js> db.countryinfo.find("GNP*1000000/demographics.Population > 30000")
    ...[output removed]
    9 documents in set, 7 warnings (0.00 sec)
    Warning (Code 1365): Division by 0
    Warning (Code 1365): Division by 0
    Warning (Code 1365): Division by 0
    Warning (Code 1365): Division by 0
    Warning (Code 1365): Division by 0
    Warning (Code 1365): Division by 0
    Warning (Code 1365): Division by 0
    
    Вы можете отделить значение от условия поиска при использовании метода bind(). Например, вместо того, чтобы определить трудно кодированное название страны как условие, замените его заполнителем, состоящим из двоеточия, сопровождаемого именем, которое начинается с буквы, например, country. Включайте заполнитель и значение в метод bind() следующим образом:
    mysql-js> db.countryinfo.find("Name = :country").bind("country", "Italy")
    [{"GNP": 1161755, "IndepYear": 1861, "Name": "Italy", "_id": "ITA",
      "demographics": {"LifeExpectancy": 79, "Population": 57680000},
      "geography": {"Continent": "Europe", "Region": "Southern Europe",
                    "SurfaceArea": 301316},
      "government": {"GovernmentForm": "Republic",
                     "HeadOfState": "Carlo Azeglio Ciampi"}
    }]
    1 document in set (0.01 sec)
    

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

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

    Проектные результаты

    Вы можете возвратить определенные поля документа, вместо того, чтобы получить их все. Следующий пример возвращает поля GNP и Name всех документов в наборе countryinfo, соответствующих условиям поиска.

    Используйте метод fields(), чтобы передать список полей.

    mysql-js> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"])
    [{"GNP": 8510700, "Name": "United States"}]
    1 document in set (0.00 sec)
    

    Используйте следующий запрос, чтобы импортировать модуль mysqlx:

    mysql-js> var mysqlx=require('mysqlx');
    
    Измените названия полей следующим выражением, чтобы возвратить только два документа.
    mysql-js> db.countryinfo.find().
    fields(mysqlx.expr('{"Name": upper(Name), "GNPPerCapita": GNP*1000000/demographics.Population}')).
    limit(2)
    [{"GNPPerCapita": 8038.834951456311, "Name": "ARUBA"},
     {"GNPPerCapita": 263.0281690140845, "Name": "AFGHANISTAN"}]
    2 documents in set (0.00 sec)
    
    Limit, Sort и Skip для результатов

    Вы можете применять методы limit(), sort() и skip(), чтобы управлять числом и порядком документов, возвращенных методом find().

    Чтобы определить число документов, включенных в набор результатов, примените метод limit() со значением к методу find(). Следующий запрос возвращает первые пять документов в наборе countryinfo.

    mysql-js> db.countryinfo.find().limit(5)
    ... [output removed]
    5 documents in set (0.00 sec)
    
    Чтобы определить порядок результатов, примените метод sort(). Передайте методу sort() список полей для сортировки и опционально атрибут порядка сортировки: по убыванию (desc) или возрастанию (asc). Порядок по возрастанию принят по умолчанию.

    Например, следующий запрос сортирует все документы по полю IndepYear и затем возвращает первые восемь документов в порядке убывания.

    mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8)
    ... [output removed]
    8 documents in set (0.00 sec)
    
    По умолчанию метод limit() запускается с первого документа в наборе. Вы можете использовать метод skip(), чтобы изменить начальный документ. Например, чтобы проигнорировать первый документ и возвратить следующие восемь документов, соответствующих условию, передайте методу skip() значение 1.
    mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1)
    ... [output removed]
    8 documents in set (0.00 sec)
    
    Соответствующая информация
    • MySQL Reference Manual обеспечивает детализированную документацию относительно функций и операторов.

    • См. CollectionFindFunction для полного определения синтаксиса.

    3.4.4.4. Изменение документов

    Вы можете использовать метод modify(), чтобы обновить один или более документов в наборе. X DevAPI обеспечивают дополнительные методы для использования с modify() для:

    • Определения полей в документе.

    • Добавления, вставки и удаления массивов.
    • Связывания, ограничения и сортировки документов, которые будут изменены.

    Определение и разопределение полей

    Метод modify() работает, фильтруя набор, чтобы включить только документы, которые будут изменены, а затем применяя операции, которые Вы определяете, к тем документам.

    В следующем примере modify() метод использует условие поиска, чтобы идентифицировать документ, подлежащий изменению, а затем метод set() заменяет два значения в пределах вложенного объекта demographics.

    mysql-js> db.countryinfo.modify("_id = 'SEA'").
    set("demographics", {LifeExpectancy: 78, Population: 28})
    Query OK, 1 item affected (0.04 sec)
    
    После того, как Вы изменяете документ, используйте метод find(), чтобы проверить изменения.

    Чтобы удалить контент из документа, используйте методы modify() и unset(). Например, следующий запрос удаляет GNP из документа, который соответствует условию поиска.

    mysql-js> db.countryinfo.modify("Name = 'Sealand'").unset("GNP")
    Query OK, 1 item affected (0.01 sec)
    
    Используйте метод find(), чтобы проверить изменения.
    mysql-js> db.countryinfo.find("Name = 'Sealand'")
    [{"IndepYear": 1967, "Name": "Sealand", "_id": "SEA",
      "demographics": {"LifeExpectancy": 78, "Population": 28},
      "geography": {"Continent": "Europe", "Region": "British Islands",
                    "SurfaceArea": 193},
      "government": {"GovernmentForm": "Monarchy",
                     "HeadOfState": "Michael Bates"}
    }]
    1 document in set (0.00 sec)
    
    Добавление, вставка и удаление массивов

    Чтобы добавить элемент к полю массива, вставить или удалить элементы в массиве, используйте методы arrayAppend(), arrayInsert() или arrayDelete(). Следующие примеры изменяют набор countryinfo, чтобы позволить отследить международные аэропорты.

    Первый пример использует modify() и set(), чтобы создать новое поле Airports во всех документах.

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

    mysql-js> db.countryinfo.modify().set("Airports", [])
    Query OK, 240 items affected (0.07 sec)
    
    С добавленным полем Airports следующий пример использует метод arrayAppend(), чтобы добавить новый аэропорт к одному из документов. $.Airports в следующем примере представляет поле Airports текущего документа.
    mysql-js> db.countryinfo.modify("Name = 'France'").arrayAppend("$.Airports", "ORY")
    Query OK, 1 item affected (0.02 sec)
    
    Используйте db.countryinfo.find("Name = 'France'") , чтобы увидеть изменение.

    Чтобы вставить элемент в нужное место массива, используйте метод arrayInsert(), чтобы определить индекс элемента. В этом случае индекс 0 или первый элемент в массиве:

    mysql-js> db.countryinfo.modify("Name = 'France'").arrayInsert("$.Airports[0]", "CDG")
    Query OK, 1 item affected (0.04 sec)
    
    Чтобы удалить элемент из массива, Вы должны передать методу arrayDelete() индекс элемента, который будет удален.
    mysql-js> db.countryinfo.modify("Name = 'France'").arrayDelete("$.Airports[1]")
    Query OK, 1 item affected (0.03 sec)
    

    3.4.4.5. Удаление документов

    Вы можете использовать метод remove(), чтобы удалить некоторые или все документы из набора в базе данных. X DevAPI обеспечивает дополнительные методы для использования с методом remove(), чтобы фильтровать и сортировать документы, которые будут удалены.

    Удаление документов, используя условия

    Все документы, соответствующие условию, будут удалены из набора countryinfo. В этом примере один документ соответствует условию:

    mysql-js> db.countryinfo.remove("_id = 'SEA'")
    Query OK, 1 item affected (0.02 sec)
    
    Удаление первого документа

    Чтобы удалить первый документ в наборе countryinfo, используйте метод limit() со значением 1.

    mysql-js> db.countryinfo.remove().limit(1)
    Query OK, 1 item affected (0.03 sec)
    
    Удаление последнего документа по порядку

    Следующий пример удаляет последний документ в наборе countryinfo по названию страны.

    mysql-js> db.countryinfo.remove().sort(["Name desc"]).limit(1)
    Query OK, 1 item affected (0.02 sec)
    
    Удаление всех документов

    Вы можете удалить все документы в наборе. Чтобы сделать так, используйте метод remove(), не определяя условие поиска.

    3.4.4.6. Создание и удаление индексов

    Индексы используются, чтобы найти документы с определенными значениями полей быстро. Без индексирования MySQL должен начать с первого документа и затем прочитать весь набор, чтобы найти соответствующие поля. Чем больше набор, тем больше это занимает ресурсов. Если набор является большим, а запросы на определенном поле распространены, то рассматривают создание индекса на этом поле в документе.

    Например, следующий запрос выступит лучше с индексированием:

    mysql-js> db.countryinfo.find("demographics.Population < 100")
    ...[output removed]
    8 documents in set (0.00 sec)
    
    Метод createIndex() создает индекс, Вы можете определить его как неуникальный или уникальный. Используйте метод field(), чтобы объединить в цепочку поля, которые должны быть индексированы. Метод execute() создает или удаляет индекс. В MySQL поле _id эквивалентно первичному ключу по умолчанию.

    Добавление неуникального индекса

    Чтобы создать неуникальный индекс передайте имя индекса методу createIndex(). Дублирующие имена запрещены.

    В следующем примере первый параметр метода field() определяет поле Population в объекте demographics, а следующий параметр указывает, что поле должно быть индексировано как числовое значение целого числа. Последний параметр указывает, должно ли поле потребовать ограничение NOT NULL. Если это значение false, поле может содержать значения NULL.

    mysql-js> db.countryinfo.createIndex("pop").
    field("demographics.Population", "INTEGER", false).execute()
    Query OK (0.04 sec)
    
    Добавление уникального индекса

    Чтобы создать уникальный индекс передайте имя индекса методу createIndex() и укажите mysqlx.IndexType.UNIQUE. Следующий запрос импортирует модуль mysqlx, который обязан определять тип индекса:

    mysql-js> var mysqlx=require('mysqlx');
    
    Страна "Name" другое общее поле набора countryinfo для индексации. В следующем примере "Text(40)" представляет число символов, которые надо индексировать, а true указывает, что поле не может содержать значения NULL.
    mysql-js> db.countryinfo.createIndex("name", mysqlx.IndexType.UNIQUE).
    field("Name", "TEXT(40)", true).execute()
    Query OK (0.04 sec)
    
    Удаление индекса

    Чтобы удалить индекс, передайте методу dropIndex() имя индекса. Например, Вы можете удалить индекс pop следующим образом:

    mysql-js> db.countryinfo.dropIndex("pop").execute()
    Query OK (0.58 sec)
    

    3.4.5. Реляционные таблицы

    Вы можете использовать MySQL Shell, чтобы управлять не только документами JSON, но и реляционными таблицами.

    В MySQL каждая реляционная таблица связана с особым механизмом хранения. Примеры в этом разделе используют таблицы InnoDB в базе данных world_x.

    Показать все таблицы

    Вывести на экран все реляционные таблицы в базе данных world_x можно методом getTables() на объекте схемы.

    mysql-js> db.getTables()
    {
      "city": <Table:city>,
      "country": <Table:country>,
      "countrylanguage": <Table:countrylanguage>
    }
    

    Основные действия с таблицами

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

    ОперацияДействие
    db.name.insert() insert() вставляет одну или более записей в названную таблицу.
    db.name.select() select() возвращает некоторые или все записи в названной таблице.
    db.name.update() update() обновляет записи в названной таблице.
    db.name.delete() delete() удаляет одну или более записей из названной таблицы.

    3.4.5.1. Вставка записей в таблицы

    Вы можете использовать метод insert() с методом values(), чтобы вставить записи в существующую таблицу. Метод insert() принимает отдельные столбцы или все столбцы в таблице. Используйте один или больше вызовов values(), чтобы определить значения, которые будут вставлены.

    Вставка целой записи

    Чтобы вставить полную запись, передайте методу insert() все столбцы в таблице. Потом передайте values() по одному значению для каждого столбца. Например, чтобы добавить новую запись к таблице city базы данных world_x, вставьте следующую запись и нажмите Enter дважды.

    mysql-js> db.city.insert("ID", "Name", "CountryCode", "District", "Info").
    values(null, "Olympia", "USA", "Washington", '{"Population": 5000}')
    Query OK, 1 item affected (0.01 sec)
    
    Таблица city имеет пять столбцов: ID, Name, CountryCode, District и Info. Каждое значение должно соответствовать типу данных столбца, который это представляет.

    Вставка частичной записи

    Следующий пример вставляет значения в столбцы ID, Name и CountryCode таблицы city.

    mysql-js> db.city.insert("ID", "Name", "CountryCode").
    values(null, "Little Falls", "USA").values(null, "Happy Valley", "USA")
    Query OK, 2 item affected (0.03 sec)
    
    Когда Вы определяете столбцы, используя метод insert(), число значений должно соответствовать числу столбцов. В предыдущем примере Вы должны предоставить три значения, чтобы соответствовать определенным трем столбцам.

    3.4.5.2. Выбор таблиц

    Вы можете использовать метод select(), чтобы запросить и получить запись из таблицы в базе данных. X DevAPI обеспечивает дополнительные методы для использования с select(), чтобы фильтровать и сортировать возвращенные отчеты.

    MySQL предоставляет следующие операторы, чтобы определить условия поиска: OR (||), AND (&&), XOR, IS, NOT, BETWEEN, IN, LIKE, !=, <>, >, >=, <, <=, &, |, <<, >>, +, -, *, /, ~ и %.

    Получение всех записей

    Чтобы создать запрос, который возвращает все записи из существующей таблицы, используйте метод select() не определяя условия поиска. Следующий пример выбирает все записи из таблицы city в базе данных world_x.

    Ограничьте использование пустого select() интерактивными запросами. Всегда используйте явный выбор имени столбца в своем коде программы.

    mysql-js> db.city.select()
    +------+----------+-------------+----------+-------------------------+
    | ID   | Name     | CountryCode | District | Info                    |
    +------+----------+-------------+----------+-------------------------+
    |1     | Kabul    | AFG         | Kabol    | {"Population": 1780000} |
    |2     | Qandahar | AFG         | Qandahar | {"Population": 237500}  |
    |3     | Herat    | AFG         | Herat    | {"Population": 186800}  |
    ......  ...   ...  ...
    | 4079 | Rafah    | PSE         | Rafah    | {"Population": 92020}   |
    +------+----------+-------------+----------+-------------------------+
    4082 rows in set (0.01 sec)
    
    Пустой набор возвращает следующую информацию:
    Empty set (0.00 sec)
    
    Фильтрованный поиск

    Чтобы создать запрос, который возвращает ряд столбцов таблицы, используйте метод select() и определите столбцы между квадратными скобками. Этот запрос возвращает столбцы Name и CountryCode из таблицы city.

    mysql-js> db.city.select(["Name", "CountryCode"])
    +----------------+-------------+
    | Name           | CountryCode |
    +----------------+-------------+
    | Kabul          | AFG         |
    | Qandahar       | AFG         |
    | Herat          | AFG         |
    | Mazar-e-Sharif | AFG         |
    | Amsterdam      | NLD         |
    ... ...
    | Rafah          | PSE         |
    | Olympia        | USA         |
    | Little Falls   | USA         |
    | Happy Valley   | USA         |
    +----------------+-------------+
    4082 rows in set (0.00 sec)
    
    Чтобы создать запрос, который возвращает строки, соответствующие определенным условиям поиска, используйте метод where(), чтобы включить условия. Например, следующий запрос возвращает имена и коды страны городов, которые начинаются с буквы Z.
    mysql-js> db.city.select(["Name", "CountryCode"]).where("Name like 'Z%'")
    +--------------+-------------+
    | Name         | CountryCode |
    +--------------+-------------+
    | Zaanstad     | NLD         |
    | Zoetermeer   | NLD         |
    | Zwolle       | NLD         |
    | Zenica       | BIH         |
    | Zagazig      | EGY         |
    | Zaragoza     | ESP         |
    | Zamboanga    | PHL         |
    | Zahedan      | IRN         |
    | Zanjan       | IRN         |
    | Zabol        | IRN         |
    | Zama         | JPN         |
    | Zhezqazghan  | KAZ         |
    | Zhengzhou    | CHN         |
    ... ...
    | Zeleznogorsk | RUS         |
    +--------------+-------------+
    59 rows in set (0.00 sec)
    
    Вы можете отделить значение от условия поиска при использовании метода bind(). Например, вместо того, чтобы использовать "Name = 'Z%' " как условие, замените названным заполнителем, состоящим из двоеточия, сопровождаемого именем, которое начинается с буквы. Включайте заполнитель и значение в метод bind() следующим образом:
    mysql-js> db.city.select(["Name", "CountryCode"]).
    where("Name like :name").bind("name", "Z%")
    

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

    Проектные результаты

    Чтобы создать запрос, используя оператор AND, добавьте оператор между условиями поиска в метод where().

    mysql-js> db.city.select(["Name", "CountryCode"]).
     where("Name like 'Z%' and CountryCode = 'CHN'")
    +--------------+-------------+
    | Name         | CountryCode |
    +--------------+-------------+
    | Zhengzhou    | CHN         |
    | Zibo         | CHN         |
    | Zhangjiakou  | CHN         |
    | Zhuzhou      | CHN         |
    | Zhangjiang   | CHN         |
    | Zigong       | CHN         |
    | Zaozhuang    | CHN         |
    ......
    | Zhangjiagang | CHN         |
    +--------------+-------------+
    22 rows in set (0.01 sec)
    
    Чтобы определить много условных операторов, Вы можете приложить условия поиска в круглой скобке, чтобы изменить приоритет оператора. Следующий пример демонстрирует размещение операторов AND и OR.
    mysql-js> db.city.select(["Name", "CountryCode"]).
    where("Name like 'Z%' and (CountryCode = 'CHN' or CountryCode = 'RUS')")
    +--------------+-------------+
    | Name         | CountryCode |
    +--------------+-------------+
    | Zhengzhou    | CHN         |
    | Zibo         | CHN         |
    | Zhangjiakou  | CHN         |
    | Zhuzhou      | CHN         |
    ... ...
    | Zeleznogorsk | RUS         |
    +--------------+-------------+
    29 rows in set (0.01 sec)
    
    Limit, Order и Offset

    Вы можете применить методы limit(), orderBy() и offSet(), чтобы управлять числом и порядком отчетов, возвращенных методом select().

    Чтобы определить число записей, включенных в набор результатов, примените метод limit() со значением к методу select(). Например, следующий запрос возвращает первые пять записей из таблицы country.

    mysql-js> db.country.select(["Code", "Name"]).limit(5)
    +------+-------------+
    | Code | Name        |
    +------+-------------+
    | ABW  | Aruba       |
    | AFG  | Afghanistan |
    | AGO  | Angola      |
    | AIA  | Anguilla    |
    | ALB  | Albania     |
    +------+-------------+
    5 rows in set (0.00 sec)
    
    Чтобы определить порядок результатов, примените orderBy(). Передайте методу orderBy() список из одного или более столбцов для сортировки и порядок, в котором расположить результаты: по убыванию (desc) или по возрастанию (asc). Вариант по возрастанию используется по умолчанию.

    Например, следующий запрос сортирует все записи по столбцу Name, а затем возвращают первые три в порядке убывания.

    mysql-js> db.country.select(["Code", "Name"]).orderBy(["Name desc"]).limit(3)
    +------+------------+
    | Code | Name       |
    +------+------------+
    | ZWE  | Zimbabwe   |
    | ZMB  | Zambia     |
    | YUG  | Yugoslavia |
    +------+------------+
    3 rows in set (0.00 sec)
    
    По умолчанию метод limit() запускается с первой записи в таблице. Вы можете использовать offset(), чтобы изменить начальную запись. Например, чтобы проигнорировать первую запись возвратить следующие три, соответствующие условию, передайте методу offset() значение 1.
    mysql-js> db.country.select(["Code", "Name"]).orderBy(["Name desc"]).limit(3).offset(1)
    +------+------------+
    | Code | Name       |
    +------+------------+
    | ZMB  | Zambia     |
    | YUG  | Yugoslavia |
    | YEM  | Yemen      |
    +------+------------+
    3 rows in set (0.00 sec)
    

    3.4.5.3. Обновление таблиц

    Вы можете использовать метод update(), чтобы изменить одну или более записей в таблице. update() работает, фильтруя запрос, чтобы включить только те записи, которые будут обновлены, а затем применяя к ним операции, которые Вы определяете.

    Чтобы заменить название города в таблице city, передайте методу set() новое название города. Затем передайте название города методу where(), чтобы определить местонахождение и заменить. Следующий пример заменяет город Peking на Beijing.

    mysql-js> db.city.update().set("Name", "Beijing").where("Name = 'Peking'")
    Query OK, 1 item affected (0.04 sec)
    
    Use the select() method to verify the change.
    mysql-js> db.city.select(["ID", "Name", "CountryCode", "District", "Info"]).where("Name = 'Beijing'")
    +------+---------+-------------+----------+-------------------------+
    | ID   | Name    | CountryCode | District | Info                    |
    +------+---------+-------------+----------+-------------------------+
    | 1891 | Beijing | CHN         | Peking   | {"Population": 7472000} |
    +------+---------+-------------+----------+-------------------------+
    1 row in set (0.00 sec)
    

    3.4.5.4. Удаление таблиц

    Вы можете использовать метод delete(), чтобы удалить некоторые или все записи из таблицы в базе данных. X DevAPI обеспечивает дополнительные методы для использования с delete(), чтобы фильтровать и упорядочить записи, которые будут удалены.

    Удаление записей, используя условия

    Пример передает условия в метод delete(). Все записи, соответствующие условию, будут удалены из таблицы city. В этом примере одна запись соответствует условию.

    mysql-js> db.city.delete().where("Name = 'Olympia'")
    Query OK, 1 item affected (0.01 sec)
    
    Удаление первой записи

    Чтобы удалить первую запись в таблице city, используйте метод limit() со значением 1.

    mysql-js> db.city.delete().limit(1)
    Query OK, 1 item affected (0.02 sec)
    
    Удаление всех записей в таблице

    Вы можете удалить все записи в таблице. Чтобы сделать так, используйте delete(), не определяя условие поиска.

    3.4.6. Документы в таблицах

    В MySQL таблица может содержать традиционные реляционные данные, значения JSON или то и другое вместе. Вы можете объединить традиционные данные с документами JSON, храня документы в столбцах, имеющих нативный тип данных JSON.

    Примеры в этом разделе используют таблицу city в базе данных world_x.

    Описание таблицы city

    У таблицы city есть пять столбцов (или полей).

    +-------------+----------+------+-----+---------+----------------+
    | Field       | Type     | Null | Key | Default | Extra          |
    +-------------+----------+------+-----+---------+----------------+
    | ID          | int(11)  | NO   | PRI | null    | auto_increment |
    | Name        | char(35) | NO   |     |         |                |
    | CountryCode | char(3)  | NO   |     |         |                |
    | District    | char(20) | NO   |     |         |                |
    | Info        | json     | YES  |     | null    |                |
    +-------------+----------+------+-----+---------+----------------+
    

    Вставка записи

    Чтобы вставить документ в столбец таблицы, передайте методу values() правильно построенный документ JSON в правильном порядке. В следующем примере документ передают как заключительное значение, которое будет вставлено в столбец Info.

    mysql-js> db.city.insert().
    values(null, "San Francisco", "USA", "California", '{"Population":830000}')
    Query OK, 1 item affected (0.01 sec)
    

    Выбор записи

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

    mysql-js> db.city.select(["ID", "Name", "CountryCode", "District", "Info"]).
      where("CountryCode = :country and Info->'$.Population' > 1000000").
      bind('country', 'USA')
    +------+--------------+-------------+--------------+-------------------------+
    | ID   | Name         | CountryCode | District     | Info                    |
    +------+--------------+-------------+--------------+-------------------------+
    | 3793 | New York     | USA         | New York     | {"Population": 8008278} |
    | 3794 | Los Angeles  | USA         | California   | {"Population": 3694820} |
    | 3795 | Chicago      | USA         | Illinois     | {"Population": 2896016} |
    | 3796 | Houston      | USA         | Texas        | {"Population": 1953631} |
    | 3797 | Philadelphia | USA         | Pennsylvania | {"Population": 1517550} |
    | 3798 | Phoenix      | USA         | Arizona      | {"Population": 1321045} |
    | 3799 | San Diego    | USA         | California   | {"Population": 1223400} |
    | 3800 | Dallas       | USA         | Texas        | {"Population": 1188580} |
    | 3801 | San Antonio  | USA         | Texas        | {"Population": 1144646} |
    +------+--------------+-------------+--------------+-------------------------+
    9 rows in set (0.01 sec)
    

    3.5. MySQL Shell для Python

    3.5.1. Введение

    Руководство по MySQL Shell для Python обеспечивает короткое, но всестороннее введение в функциональность базы данных включая новый X DevAPI, который предлагает современный, интегральный способ работать с данными, не требуя знания SQL от разработчиков приложений.

    В MySQL таблицы нативный тип контейнера хранения данных, и наборы сохранены, внутренне используя таблицы.

    Документы и наборы JSON

    В JSON документом является структура данных, составленная из пар поле/значение, сохраненных в пределах набора. Значения полей часто содержат другие документы, массивы и списки документов.

    {"GNP": .6, "IndepYear": 1967, "Name": "Sealand", "_id": "SEA",
     "demographics": {"LifeExpectancy": 79, "Population": 27},
     "geography": {"Continent": "Europe", "Region": "British Islands",
                   "SurfaceArea": 193},
     "government": {"GovernmentForm": "Monarchy",
                    "HeadOfState": "Michael Bates"}
    }
    

    Реляционные таблицы

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

    +----+----------------+-------------+---------------+-------------------------+
    | ID | Name           | CountryCode | District      | Info                    |
    +----+----------------+-------------+---------------+-------------------------+
    |1   | Kabul          | AFG         | Kabol         | {"Population": 1780000} |
    |2   | Qandahar       | AFG         | Qandahar      | {"Population": 237500}  |
    |3   | Herat          | AFG         | Herat         | {"Population": 186800}  |
    |4   | Mazar-e-Sharif | AFG         | Balkh         | {"Population": 127800}  |
    |5   | Amsterdam      | NLD         | Noord-Holland | {"Population": 731200}  |
    |6   | Rotterdam      | NLD         | Zuid-Holland  | {"Population": 593321}  |
    +----+----------------+-------------+---------------+-------------------------+
    

    3.5.2. Образец базы данных

    Образец базы данных world_x содержит некий набор JSON и 3 реляционных таблицы:

    • Набор

      • countryinfo: информация о странах в мире.

    • Таблицы

      • country: минимальная информация о странах мира.

      • city: информация о некоторых из городов в странах.
      • countrylanguage: языки, на которых говорят в каждой стране.

    Требования

    Вы должны установить MySQL Shell с X Protocol. Для инструкций см. раздел 3.3.

    Запустите сервер прежде, чем Вы загрузите базу данных world_x для этого руководства.

    Загрузка базы данных world_x

    Чтобы подготовить образец базы данных world_x, следуйте этим шагам:

    1. Скачайте world_x-db.zip.

    2. Извлеките архив установки во временный каталог, например, в /tmp/. Распаковка архива приводит к единственному файлу world_x.sql.
    3. Создайте или обновите схему следующей командой:
      mysqlsh -u root --sql --recreate-schema world_x < /tmp/world_x-db/world_x.sql
      Enter password: ****
      Recreating schema world_x...
      
      Введите свой пароль когда надо. Не-root учетная запись может использоваться, если у нее записи есть привилегии создавать новые базы данных.

      Замените /tmp/ на путь к файлу world_x.sql в Вашей системе.

    3.5.3. MySQL Shell

    MySQL Shell является объединенным интерфейсом скриптов для сервера MySQL. Это поддерживает скрипты на JavaScript и Python. JavaScript режим обработки по умолчанию. В большинстве случаев Вы нуждаетесь в учетной записи, чтобы соединиться с местным сервером MySQL.

    Запуск MySQL Shell

    После того, как Вы установили и запустили сервер MySQL, соединитесь с сервером. По умолчанию MySQL Shell соединяется, используя X Protocol.

    На той же самой системе, где работает сервер, откройте окно терминала и запустите MySQL Shell следующей командой:

    mysqlsh -u name world_x
    Creating an X Session to name@localhost:33060/world_x
    Enter password: ****
    
    Вы, возможно, должны определить другой путь, соответственно своей системе.

    Кроме того:

    • name представляет имя пользователя Вашей учетной записи MySQL.

    • MySQL Shell запросит его пароль.
    • Опция --py запускает MySQL Shell в режиме Питона. Если Вы опускаете --py, MySQL Shell запускается в режиме JavaScript.
    • Схема по умолчанию для этого сеанса: база данных world_x.

    Подсказка mysql-py> указывает, что активный язык для этого сеанса Python.

    mysql-py>
    
    Когда Вы выполняете mysqlsh без параметра host, MySQL Shell пытается соединиться с сервером по адресу localhost на порту 33060. Чтобы определить иной хост или номер порта, как и другие опции, см. описания опций на mysqlsh The MySQL Shell.

    MySQL Shell поддерживает входную строку, редактируемую следующим образом:

    • Клавиши стрелка влево и стрелка вправо перемещают горизонтально в пределах текущей входной строки.

    • Клавиши стрелка вверх и стрелка вниз перемещают вверх и вниз по набору ранее введенных строк.
    • Backspace и Enter действуют как и везде.

    Получение справки по MySQL Shell

    Введите mysqlsh --help на подсказку Вашего интерпретатора команд для получения списка параметров командной строки.

    mysqlsh --help
    
    Введите \help на подсказку MySQL Shell для получения списка доступных команд и их описания.
    mysql-py> \help
    
    Введите \help и имя команды для получения подробной справки о команде MySQL Shell. Например, чтобы посмотреть справку по команде \connect, введите:
    mysql-py> \help \connect
    

    Выход из MySQL Shell

    Чтобы выйти из MySQL Shell, введите следующую команду:

    mysql-py> \quit
    

    Использование MySQL Shell для Python абсолютно аналогично использованию MySQL Shell для JavaScript, поэтому приведенное выше описание для JavaScript полностью пригодно и для Python, разумеется, с поправками на синтаксис языка.

    3.6. MySQL для Visual Studio

    Этот раздел объясняет, как использовать MySQL Shell, чтобы написать скрипт сервера MySQL для Visual Studio.

    Введение

    MySQL для Visual Studio обеспечивает доступ к объектам MySQL и данным, не вынуждая разработчиков покидать Visual Studio. MySQL для Visual Studio разработан как пакет Visual Studio, он напрямую встраивается в Server Explorer, предоставляя свободный доступ к объектам и соединениям.

    Следующие особенности MySQL для Visual Studio доступны с версии 2.0.2:

    • Редакторы кода для JavaScript и Python, где скрипты могут быть выполнены, чтобы запросить данные из базы данных MySQL.

    • Лучшая интеграция с Server Explorer, чтобы открыть редактор кода для MySQL, JavaScript и Python напрямую при соединении с сервером MySQL.
    • Более новый интерфейс для того, чтобы вывести на экран результаты запроса:

      • Множественные вкладки для каждого набора результатов.

      • Представление результатов, где информация может быть представлена в виде сетки, дерева или текстового представления для результатов JSON.
      • Просмотр типов полей, где показана информация о наборе результатов: имена, типы, наборы символов и т.д.
      • Представление статистики запроса выводит на экран информацию о выполненном запросе, такую как время выполнения, обработанные строки, индексы, использование временных таблиц и многое другое.
      • Представление плана выполнения выводит на экран объяснение выполнения запроса, сделанное внутренне сервером MySQL.

    С чего начать

    Требуется MySQL для Visual Studio 2.0.2 или выше и Visual Studio 2010 или выше. X DevAPI требует MySQL Server 5.7.12 или выше с включенной поддержкой X plugin.

    Запуск Code Editor

    Перед запуском редактора кода, который может выполнить запросы к серверу MySQL, соединение должно быть установлено:

    1. Откройте Server Explorer через меню View или Control + W, K.

    2. Щелкните правой кнопкой по узлу Data Connections и выберите Add Connection....
    3. В диалоге Add Connection удостоверьтесь, что источник данных MySQL используется, и заполните всю информацию.

      Чтобы ввести номер порта, щелкните по Advanced... и установите Port среди списка свойств соединения.

    4. Щелкните Test Connection, чтобы гарантировать, что Вы имеете допустимое соединение, затем нажмите OK.

    5. Щелкните правой кнопкой Ваше недавно созданное соединение, выберите New MySQL Script и затем язык для редактора кода, который Вы хотите открыть.

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

    Использование Code Editor

    У редакторов скриптов MySQL есть панель инструментов наверху, где информация о сеансе выведена на экран, наряду с действиями, которые могут быть выполнены.

    Отметьте, что первые две кнопки на панели инструментов представляют команды соединиться или отсоединиться от сервера MySQL. Если редактор был открыт из Server Explorer, соединение будет уже установлено для нового окна редактора.

    Третья кнопка Run выполняет скрипт в окне редактора. Результаты выполнения будут выведены на экран ниже окна скрипта.

    Некоторые команды в MySQL Shell могут быть выполнены без добавления execute() в интерактивном режиме. В MySQL для Visual Studio эти команды обяхательно требуют execute(). Другими словами, добавьте ".execute()", чтобы выполнить команды.

    3.7. X Plugin

    X Plugin расширяет MySQL Server, чтобы быть в состоянии функционировать как хранилище документов. Выполнение X Plugin позволяет MySQL Server общаться с клиентами, использующими X Protocol, которые разработаны, чтобы в соответствии с ACID использовать MySQL как хранилище документов. Документы хранятся в формате JSON и включают хранение схемы. Используя X DevAPI, Вы можете использовать синтаксис подобный NoSQL, чтобы выполнить Create, Read, Update, Delete (CRUD) операции с документами.

    Этот раздел объясняет, как сконфигурировать и контролировать X Plugin в MySQL Server.

    3.7.1. Использование безопасного соединения с X Plugin

    Этот раздел объясняет, как сконфигурировать X Plugin, чтобы использовать безопасные соединения. Для большего количества вводной информации, см. раздел 7.4.

    X Plugin имеет собственные настройки SSL, которые могут отличаться от используемых с сервером MySQL. Это означает, что X Plugin может быть сконфигурирован с иным ключом SSL, сертификатом и файлом центров сертификации, чем сервер MySQL. Точно так же у X Plugin есть свои собственные переменные состояния SSL, вычисленные независимо от сервера MySQL. По умолчанию конфигурация X Plugin SSL взята из переменных mysqlx_ssl_*, описанных в разделе 3.7.2.2. Если никакая конфигурация не обеспечена, используя переменные mysqlx_ssl_*, X Plugin переходит к использованию системных переменных SSL сервера MySQL. Это означает, что Вы можете иметь отдельные конфигурации SSL для протокола MySQL и X Protocol, конфигурируя каждый отдельно, или совместно использовать конфигурацию SSL в MySQL и X Protocol, конфигурируя только переменные ssl-*.

    На сервере с установленным X Plugin, чтобы сконфигурировать MySQL Protocol и X Protocol с отдельными конфигурациями SSL используют оба набора переменных ssl-* и mysqlx-ssl-* в my.cnf:

    [mysqld]
    ssl-ca=ca1.pem
    ssl-cert=server-cert1.pem
    ssl-key=server-key1.pem
    mysqlx-ssl-ca=ca2.pem
    mysqlx-ssl-cert=server-cert2.pem
    mysqlx-ssl-key=server-key2.pem
    
    Доступные переменные mysqlx_ssl_* отражают переменные SSL в сервере MySQL, таким образом, файлы и методы, описанные для того, чтобы сконфигурировать сервер MySQL, чтобы использовать SSL в разделе 7.4.4, относятся к конфигурированию X Plugin, чтобы использовать безопасные соединения. Исключение из этого правила: переменная mysqlx_ssl, которая по умолчанию имеет значение 1, когда любая из других переменных, связанных с X Protocol SSL, сконфигурирована. Другими словами, если Вы конфигурируете какую-либо из переменных mysqlx_ssl_* не надо конфигурировать отдельно mysqlx_ssl.

    Вы можете сконфигурировать версии TLS, используемые X Protocol SSL, через системную переменную tls_version. Версия TLS, используемая MySQL и X Protocol, является поэтому той же самой версией TLS.

    Шифрование соединения является дополнительным, но определенный пользователь может быть вынужден использовать шифрование для X Protocol и MySQL. Вы конфигурируете такого пользователя запросом GRANT с опцией REQUIRE. Подробности в разделе 14.7.1.6 . Как вариант, все соединения X Protocol и MySQL могут быть вынуждены использовать шифрование, устанавливая require_secure_transport.

    3.7.2. Опции и переменные X Plugin

    Этот раздел описывает доступные параметры командной строки и системные переменные, которые конфигурируют MySQL Shell.

    3.7.2.1. Опции и переменные X Plugin: обзор

    Эта таблица обеспечивает краткий обзор параметров командной строки, системных и статусных перменных для X Plugin.

    Таблица 3.1. Опции и переменные X Plugin

    ИмяКомандная строка Файл опцийСистемная переменная Переменная статусаКонтекст переменнойДинамическая
    Mysqlx_bytes_received Да ОбаНет
    Mysqlx_bytes_sent Да ОбаНет
    mysqlx_connect_timeoutДаДаДа ГлобальноДа
    Mysqlx_connection_accept_errors ДаОбаНет
    Mysqlx_connection_errors Да ОбаНет
    Mysqlx_connections_accepted ДаГлобальноНет
    Mysqlx_connections_closed Да ГлобальноНет
    Mysqlx_connections_rejected ДаГлобальноНет
    Mysqlx_crud_delete Да ОбаНет
    Mysqlx_crud_find Да ОбаНет
    Mysqlx_crud_insert Да ОбаНет
    Mysqlx_crud_update Да ОбаНет
    Mysqlx_errors_sent Да ОбаНет
    Mysqlx_expect_close Да ОбаНет
    Mysqlx_expect_open Да ОбаНет
    mysqlx_idle_worker_thread_timeoutДаДа
    Mysqlx_init_error Да ОбаНет
    mysqlx_max_allowed_packetДаДа
    mysqlx_max_connectionsДаДаДа ГлобальноДа
    mysqlx_min_worker_threadsДаДа
    Mysqlx_notice_other_sent Да ОбаНет
    Mysqlx_notice_warning_sent Да ОбаНет
    mysqlx_port ДаДаДа Глобально Нет
    Mysqlx_rows_sent Да ОбаНет
    Mysqlx_sessions ДаГлобально Нет
    Mysqlx_sessions_accepted Да ГлобальноНет
    Mysqlx_sessions_closed Да ГлобальноНет
    Mysqlx_sessions_fatal_error ДаГлобальноНет
    Mysqlx_sessions_killed Да ГлобальноНет
    Mysqlx_sessions_rejected Да ГлобальноНет
    mysqlx_ssl ДаДаДа Глобально Нет
    Mysqlx_ssl_accept_renegotiates ДаГлобальноНет
    Mysqlx_ssl_accepts Да ГлобальноНет
    Mysqlx_ssl_active Да ОбаНет
    mysqlx_ssl_caДаДаДа ГлобальноНет
    mysqlx_ssl_capathДаДаДа ГлобальноНет
    mysqlx_ssl_certДаДаДа ГлобальноНет
    Mysqlx_ssl_cipher Да ОбаНет
    mysqlx_ssl_cipherДаДа
    Mysqlx_ssl_cipher_list Да ОбаНет
    mysqlx_ssl_crlДаДаДа ГлобальноНет
    mysqlx_ssl_crlpathДаДаДа ГлобальноНет
    Mysqlx_ssl_ctx_verify_depth ДаОбаНет
    Mysqlx_ssl_ctx_verify_mode ДаОбаНет
    Mysqlx_ssl_finished_accepts ДаГлобальноНет
    mysqlx_ssl_keyДаДаДа ГлобальноНет
    Mysqlx_ssl_server_not_after ДаГлобальноНет
    Mysqlx_ssl_server_not_before ДаГлобальноНет
    Mysqlx_ssl_verify_depth Да ГлобальноНет
    Mysqlx_ssl_verify_mode Да ГлобальноНет
    Mysqlx_ssl_version Да ОбаНет
    Mysqlx_stmt_create_collection ДаОбаНет
    Mysqlx_stmt_create_collection_index ДаОбаНет
    Mysqlx_stmt_disable_notices ДаОбаНет
    Mysqlx_stmt_drop_collection ДаОбаНет
    Mysqlx_stmt_drop_collection_index ДаОбаНет
    Mysqlx_stmt_enable_notices Да ОбаНет
    Mysqlx_stmt_execute_sql Да ОбаНет
    Mysqlx_stmt_execute_xplugin ДаОбаНет
    Mysqlx_stmt_kill_client Да ОбаНет
    Mysqlx_stmt_list_clients Да ОбаНет
    Mysqlx_stmt_list_notices Да ОбаНет
    Mysqlx_stmt_list_objects Да ОбаНет
    Mysqlx_stmt_ping Да ОбаНет
    Mysqlx_worker_threads Да ГлобальноНет
    Mysqlx_worker_threads_active ДаГлобальноНет

    3.7.2.2. Системные переменные и опции X Plugin

    Следующие системные переменные конфигурируют X Plugin:

    • --mysqlx_port[=value]

      Формат командной строки --mysqlx_port=#
      Системная переменная Имя mysqlx_port
      Контекст переменной Глобальная
      Динамическая переменная Нет
      Разрешенные значения Тип integer
      Значение по умолчанию 33060
      Минимальное значение 1
      Максимальное значение 65535

      Определяет порт, где X Plugin ждет соединений. Эта опция считана только при запуске, поэтому чтобы изменить ее на рабочем сервере требуется перезапуск.

    • --mysqlx_connect_timeout[=value]

      Формат командной строки --mysqlx_connect_timeout=#
      Системная переменная Имя mysqlx_connect_timeout
      Контекст переменной Глобальная
      Динамическая переменная Да
      Разрешенные значения Тип integer
      Значение по умолчанию 30
      Минимальное значение 1
      Максимальное значение 18446744073709551615

      Сколько секунд ждать первого пакета, который будет получен от недавно присоединенных клиентов. Эта опция динамически меняется.

    • mysqlx_idle_worker_thread_timeout[=value]

      Формат командной строки --mysqlx_idle_worker_thread_timeout=#
      Разрешенные значения Типinteger
      Значение по умолчанию 60
      Минимальное значение 0
      Максимальное значение 18446744073709551615

      Время в секундах, после которых будет закончен неактивный поток.

    • mysqlx_max_allowed_packet[=value]

      Формат командной строки --mysqlx_max_allowed_packet=#
      Разрешенные значения Тип integer
      Значение по умолчанию 1048576
      Минимальное значение 0
      Максимальное значение 18446744073709551615

      Размер сетевого пакета, который может обработать X Plugin. Эта опция меняется динамически.

    • mysqlx_max_connections[=value]

      Формат командной строки --mysqlx_max_connections=#
      Системная переменная Имя mysqlx_max_connections
      Контекст переменной Глобальная
      Динамическая переменная Да
      Разрешенные значения Тип integer
      Значение по умолчанию 100
      Минимальное значение 1
      Максимальное значение 18446744073709551615

      Максимальное количество параллельных соединений с клиентами, которые X Plugin может принять. Эта опция динамически меняется. При измении этой переменной, если новое значение меньше, чем текущее число соединений, новый предел принят во внимание только для новых соединений.

    • mysqlx_min_worker_threads[=value]

      Формат командной строки --mysqlx_min_worker_threads=#
      Разрешенные значения Типinteger
      Значение по умолчанию 2
      Минимальное значение 1
      Максимальное значение 18446744073709551615

      Минимальное число потоков X Plugin для того, чтобы обработать запросы клиентов. Максимальное количество потоков ограничено неявно --mysqlx_max_connections. Эта опция меняется динамически.

    • --mysqlx_ssl[=value]

      Формат командной строки --mysqlx_ssl=#
      Системная переменная Имя mysqlx_ssl
      Контекст переменной Глобальная
      Динамическая переменная Нет
      Разрешенные значения Тип integer

      Эквивалент ssl для X Plugin, см. ту переменную для получения дополнительной информации.

    • --mysqlx_ssl_ca[=value]

      Формат командной строки --mysqlx_ssl_ca=file_name
      Системная переменная Имя mysqlx_ssl_ca
      Контекст переменной Глобальная
      Динамическая переменная Нет
      Разрешенные значения Тип file name

      Эквивалент ssl_ca для X Plugin, см. ту переменную для получения дополнительной информации.

    • --mysqlx_ssl_capath[=value]

      Формат командной строки --mysqlx_ssl_capath=dir_name
      Системная переменная Имя mysqlx_ssl_capath
      Контекст переменной Глобальная
      Динамическая переменная Нет
      Разрешенные значения Тип directory name

      Эквивалент ssl_capath для X Plugin, см. ту переменную для получения дополнительной информации.

    • --mysqlx_ssl_cert[=value]

      Формат командной строки --mysqlx_ssl_cert
      Системная переменная Имя mysqlx_ssl_key
      Контекст переменной Глобальная
      Динамическая переменная Нет
      Разрешенные значения Тип file name

      Эквивалент ssl_cert для X Plugin, см. ту переменную для получения дополнительной информации.

    • --mysqlx_ssl_cipher[=value]

      Формат командной строки --mysqlx_ssl_cipher=name
      Разрешенные значения Тип string

      Эквивалент ssl_cipher для X Plugin, см. ту переменную для получения дополнительной информации.

    • --mysqlx_ssl_crl[=value]

      Формат командной строки --mysqlx_ssl_crl=file_name
      Системная переменная Имя mysqlx_ssl_crl
      Контекст переменной Глобальная
      Динамическая переменная Нет
      Разрешенные значения Тип file name

      Эквивалент ssl_crl for X Plugin, см. ту переменную для получения дополнительной информации.

    • --mysqlx_ssl_crlpath[=value]

      Формат командной строки --mysqlx_ssl_crlpath=directory_name
      Системная переменная Имя mysqlx_ssl_crlpath
      Контекст переменной Глобальная
      Динамическая переменная Нет
      Разрешенные значения Тип directory name

      Эквивалент ssl_crlpath для X Plugin, см. ту переменную для получения дополнительной информации.

    • --mysqlx_ssl_key[=value]

      Формат командной строки --mysqlx_ssl_key=file_name
      Системная переменная Имя mysqlx_ssl_key
      Контекст переменной Глобальная
      Динамическая переменная Нет
      Разрешенные значения Тип file name

      Эквивалент ssl_key для X Plugin, см. ту переменную для получения дополнительной информации.

    3.7.3. Контроль X Plugin

    Этот раздел описывает, как контролировать X Plugin. Есть два доступных метода контроля, используя таблицы исполнительной схемы или переменные состояния.

    3.7.3.1. Переменные состояния для X Plugin

    У переменных состояния есть следующие значения.

    3.8. Руководство пользователя MySQL Shell

    Этот раздел предоставляет пользовательскую документацию MySQL Shell, которая позволяет Вам создать прототип приложения, используя X DevAPI, чтобы общаться с сервером MySQL, выполняющим X Plugin.

    MySQL Shell является усовершенствованным клиентом командной строки и редактором кода для сервера MySQL. В дополнение к SQL MySQL Shell также предлагает разработку скриптов на JavaScript и Python. Когда MySQL Shell соединен с Сервером MySQL через X Protocol, X DevAPI может использоваться, чтобы работать с реляционными данными и с данными о документе.

    3.8.1. Особенности MySQL Shell

    Следующие особенности доступны в MySQL Shell.

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

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

    Поддерживаемые языки

    MySQL Shell обрабатывает код на следующих языках: JavaScript, Питон и SQL. Любой введенный код обработан как один из этих языков, основываясь на языке, который является в настоящее время активным. Есть также определенные команды, которые обработаны, как команды оболочки, которые позволяют Вам сконфигурировать MySQL Shell или получить информацию. Для получения дополнительной информации см. раздел 3.8.4.1.

    Пакетное выполнение кода

    В дополнение к интерактивному выполнению кода MySQL Shell может также взять код из различных источников и обработать это. Этот метод обработки кода неинтерактивным способом называют Пакетным выполнением.

    Поскольку пакетный режим выполнения предназначен для обработки скрипта единственного языка, это ограничено наличием минимального неотформатированного вывода и отключением выполнения команд. Чтобы избежать этих ограничений, используйте опцию командной строки --interactive, которая говорит MySQL Shell выполнить ввод, как будто это был интерактивный сеанс. В этом режиме ввод обработан построчно, как если бы каждая строка была введена в интерактивном сеансе. Для получения дополнительной информации см. раздел 3.8.3.5.

    Выходные форматы

    MySQL Shellобеспечивает вывод в различных форматах в зависимости от того, как используется: разделенный табуляциями, табличный и JSON.

    Поддержка множественных строк

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

    Сохраненные сеансы

    MySQL Shell поддерживает список данных о соединении для различных серверов. Вы можете соединиться с сервером, используя эти сохраненные сеансы. Список сохраненных сеансов может быть отредактирован. См. раздел 3.8.5.

    Журнал приложения

    MySQL Shell может быть сконфигурирован, чтобы зарегистрировать информацию о процессе выполнения. Для получения дополнительной информации см. раздел 3.8.6.

    X DevAPI

    Код, написанный в MySQL Shell использует X DevAPI и обрабатывается на Python или JavaScript.

    Поддержка X Protocol

    MySQL Shell разработан, чтобы предоставить интегрированный клиент командной строки для всех продуктов MySQL, которые поддерживают X Protocol. Особенности развития MySQL Shell разработаны для сеансов, используя X Protocol. MySQL Shell может также соединиться с серверами MySQL, которые не поддерживают X Protocol, используя старый протокол MySQL. Минимальный набор особенностей X DevAPI доступен для сеансов, создаваемых, используя протокол MySQL.

    Глобальный сеанс

    Взаимодействие с Сервером MySQL сделано через объект сеанса. Для Питон и JavaScript, сеанс может быть создан через функции getSession и getNodeSession модуля mysqlx. Если сеанс создается в режиме JavaScript, используя какой-либо из этих методов, это доступно только в режиме JavaScript. То же самое происходит, если сеанс создается в режиме Питона. Ни один из этих сеансов не может использоваться в режиме SQL.

    Для режима SQL понятие глобального сеанса поддержано MySQL Shell. Глобальный сеанс создается, когда информацию о соединении передают MySQL Shell, используя параметры командной строки или при использовании команды \connect.

    Глобальный сеанс используется, чтобы выполнить запросы в режиме SQL, и тот же самый сеанс доступен в режимах Питона или JavaScript. Когда глобальный сеанс создается, переменная session установлен в языках скриптов, таким образом, Вы можете выполнить код на различных языках, переключая активный режим. Для получения дополнительной информации, см. раздел 3.8.2.1.

    3.8.2. Работа с MySQL Shell

    Этот раздел описывает, как начать работать с MySQL Shell. Этот раздел предполагает, что у Вас есть сервер MySQL, выполняющий X Plugin и что Вы установили MySQL Shell, см. раздел 3.3.

    3.8.2.1. Сеансы MySQL Shell

    Этот раздел объясняет различные типы сеансов в MySQL Shell, как создать и сконфигурировать их.

    3.8.2.1.1. Объяснение сеансов MySQL Shell

    MySQL Shell является объединенным интерфейсом, чтобы управлять сервером MySQL посредством языков скриптов, таких как JavaScript или Питон. Чтобы поддержать совместимость с предыдущими версиями, SQL может также быть выполнен в определенных режимах. Соединение с сервером MySQL требуется. В MySQL Shell эти соединения обработаны объектом сеанса.

    Следующие различные типы объектов сеанса доступны:

    • XSession: Используйте этот тип сеанса для новой разработки приложений. Это предлагает лучшую интеграцию с cервером MySQL и поэтому используется по умолчанию. Выполнение SQL не поддерживается, поэтому это не совместимо с MySQL Shell в режиме SQL.

    • Node Session: Используйте этот тип сеанса для выполнения SQL на сервере MySQL с X Protocol. Выполнение SQL доступно с этим типом сеанса, поэтому это может использоваться в режиме SQL MySQL Shell.

      Этот тип сеанса должен использоваться только, когда соединение непосредственно с MySQL сервером с поддержкой X Protocol.

    • Classic Session: Используйте этот тип сеанса, чтобы взаимодействовать с серверами MySQL, у которых нет X Protocol. Выполнение SQL доступно с этим типом сеанса, поэтому это может использоваться в режиме SQL MySQL Shell.

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

    3.8.2.1.2. Выбор типа сеанса MySQL Shell

    MySQL Shell создает объект XSession по умолчанию. Чтобы выбрать, какой тип сеанса должен быть создан, используйте одну из этих опций:

    • --node создает Node Session.

    • --classic создает Classic Session.
    • --x создает XSession.

    3.8.2.2. Соединения MySQL Shell

    MySQL Shell может быть сконфигурирован, чтобы соединиться с сервером MySQL, выполняющим X Plugin, используя параметры командной строки при запуске или непосредственно в MySQL Shell. Адрес сервера MySQL может быть определен, используя отдельные параметры, такие как пользователь, имя хоста и порт, или используя Uniform Resource Identifier (URI) в формате user@host:port/schema, например, mike@myserver:33060/testDB. Следующие разделы описывают эти методы.

    Независимо от метода, которым Вы хотите соединиться, важно понять, как пароли будут обработаны MySQL Shell.

    По умолчанию соединение требует пароля. Пароль требуется при приглашении ко входу в систему. Чтобы определить учетную запись без пароля, используют опцию --password или : после user в URI.

    Если Вы не определяете параметры для соединения, следующие значения по умолчанию используются:

    • Имя пользователя текущей системы.

    • Имя хоста localhost.
    • port по умолчанию 33060 для X Session или 3306 для Classic session.

    MySQL Shell соединения, используя X Protocol всегда применяют TCP, использование Linux sockets не поддерживается. MySQL Shell соединения, использующие протокол MySQL, могут использовать Linux sockets с помощью опции --socket.

    3.8.2.2.1. Соединение с помощью строки URI

    Вы конфигурируете сервер MySQL, с которым соединяется MySQL Shell, передавая данные о соединении в строковом формате, используя опцию --uri.

    Используйте следующий формат:

    [dbuser[:[dbpassword]]@]host[:port][/schema]
    
    Описание этих опций:

    • dbuser: определяет учетную запись пользователя MySQL, которая будет использоваться для процесса аутентификации.

    • dbpassword: определяет пароль dbuser, который будет использоваться для процесса аутентификации. Хранение пароля в URI не рекомендуется.

    • host: определяет хост, с которым соединяется объект сеанса. Если не определен, по умолчанию использутеся localhost.

    • port: определяет порт. Если не определен, 33060 используется по умолчанию для X Protocol и 3306 для обычного MySQL.
    • schema: указывает на базу данных, которая будет установлена по умолчанию, когда сеанс установлен.

    Если никакой пароль не определен, используя URI, то пароль запрошен. Следующие примеры показывают, как использовать эти параметры командной строки:

    • Соединитесь с Node Session на порту 33065.

      shell> mysqlsh --uri user@localhost:33065 --node
      
    • Соединитесь с Classic Session.

      shell> mysqlsh --uri user@localhost --classic
      

    Хотя использование учетной записи без пароля не рекомендуется, Вы можете определить пользователя без пароля, используя : после имени пользователя, например:

    shell> mysqlsh --uri user:@localhost
    
    В дополнение к определению URI вручную, Вы можете использовать сохраненный сеанс. См. раздел 3.8.5.

    3.8.2.2.2. Соединение, используя отдельные параметры

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

    Используйте следующие параметры:

    Первые 5 параметров соответствуют маркерам, используемым в формате URI, описанном в разделе 3.8.2.2.1.

    Параметр --password указывает, что пользователь должен соединиться без пароля.

    Для совместимости следующие псевдонимы поддержаны для некоторых параметров:

    Установить XSession с указанным пользователем на порту 33065:

    shell> mysqlsh -u user -h localhost -P 33065
    
    Установить Classic Session с указанным пользователем:
    shell> mysqlsh -u user -h localhost --classic
    
    Установить Node Session с указанным пользователем:
    shell> mysqlsh --node -u user -h localhost
    
    3.8.2.2.3. Применение SSL для безопасных соединений

    Использование SSL возможно, когда соединение по SSL включено на сервере MySQL. Чтобы сконфигурировать соединение SSL, используйте следующие параметры командной строки:

    • --ssl: Это включает или отключает соединения через SSL. Если установлено в 0, другие параметры командной строки, относящиеся к SSL будут проигнорированы.

    • --ssl-ca=filename: Путь к файлу в формате PEM, который содержит список центров сертификации SSL, которым доверяют.
    • --ssl-cert=filename: Имя файла сертификата SSL в формате PEM, чтобы использовать для создания безопасного соединения.
    • --ssl-key=filename: Название файла ключа SSL в формате PEM, чтобы использовать для создания безопасного соединения.

    Опция --ssl, как предполагается, 1 (включено), если другие опции SSL установлены.

    3.8.2.2.4. Соединение, использующее URI и отдельные параметры

    Когда опция --uri определена в комбинации с некоторыми из отдельных параметров, адрес, определенный опцией --uri, используется в качестве основных данных о соединении, а значения, обеспеченные, используя отдельные параметры, переопределяют соответствующее значение из URI. Если использована опция --user, она заменяет любого пользователя, определенного как часть URI.

    Например, чтобы установить XSession и переопределить user из URI можно так:

    shell> mysqlsh --uri user@localhost:33065 --user otheruser
    
    3.8.2.2.5. Создание сеанса используя команды Shell

    Если Вы открываете MySQL Shell, не определяя параметры соединения, MySQL Shell открывается без установленного глобального сеанса. Возможно установить глобальный сеанс после запуска MySQL Shell, используя следующие команды Shell:

    • \connect URI: Создает XSession.

    • \connect -n URI: Создает Node Session.
    • \connect -c URI: Создает Classic Session.

    Сконфигурируйте соединение, используя параметр URI, который следует тому же синтаксису, что касается параметра командной строки --uri. Для дополнительной информации см. раздел 3.8.2.2.1.

    Например:

    mysql-js> \connect root@localhost
    Creating XSession to root@localhost...
    Enter password: ****
    No default schema selected.
    mysql-js>
    
    3.8.2.2.5.1. Создание безопасного сеанса используя SSL

    Чтобы установить соединение SSL, параметр URI, который передают командам оболочки, должен включать информацию SSL как параметры URL. Например:

    mysql-js> \connect root@localhost?ssl_ca=/path/to/ca/file&\
    ssl_cert=/path/to/cert/file&ssl_key=/path/to/key/file
    Creating XSession to root@localhost...
    Enter password: ****
    No default schema selected.
    mysql-js>
    
    3.8.2.2.6. Соединения в JavaScript и Питон

    Когда соединение сделано, используя параметры командной строки или при использовании любой из команд оболочки, глобальный объект сеанса создается. Этот сеанс глобален, потому что когда-то созданный, он может использоваться в любом из режимов выполнения MySQL Shell.

    Любой глобальный объект сеанса доступен в режимах JavaScript или Питона, потому что переменная session хранит ссылку на него.

    В режиме SQL могут использоваться сеансы Node и Classic, потому что они оба поддерживают выполнение SQL. В режиме SQL не может использоваться только XSession.

    В дополнение к глобальному объекту сеансы могут быть установлены и назначены различным переменным при использовании функций, доступных в модулях mysql и mysqlx JavaScript и Питона.

    Например, следующие функции обеспечены этими модулями:

    • mysql.getSession(connectionData[,password])

    • mysqlx.getNodeSession(connectionData[,password])
    • mysql.getClassicSession(connectionData[,password])

    Первая из этих функций используется, чтобы создать XSession. Второе Node Session, которая соединяется с X Protocol и позволяет выполнение SQL. Последняя возвращает объект Classic Session, который использует традиционный протокол MySQL и имеет очень ограниченный API.

    connectionData может быть URI, как определено выше, или набор параметров соединения. См. раздел 3.8.2.2.1.

    Следующий пример показывает, как создать Node Session с X Protocol:

    mysql-js> var mysqlx=require('mysqlx').mysqlx;
    mysql-js> var session=mysqlx.getNodeSession('root@localhost');
    mysql-js> print(session)
    <NodeSession:root@localhost>
    mysql-js>
    
    Следующий пример показывает, как создать Node Session с X Protocol так, чтобы Вы могли выполнить SQL:
    mysql-js> var mysqlx=require('mysqlx').mysqlx;
    mysql-js> var session=mysqlx.getNodeSession({host: 'localhost', dbUser: 'root'});
    mysql-js> print(session)
    <NodeSession:root@localhost>
    mysql-js>
    
    Следующий пример показывает, как создать Classic Session:
    mysql-js> var mysql=require('mysql').mysql;
    mysql-js> var session = mysql.getClassicSession('root@localhost:3307');
    mysql-js> print(session)
    <ClassicSession:root@localhost:3307>
    mysql-js>
    
    3.8.2.2.6.1. SSL для безопасных соединений

    Чтобы установить соединение SSL, установите информацию SSL в connectionData. Например:

    mysql-js> var mysqlx=require('mysqlx').mysqlx;
    mysql-js> var session=mysqlx.getNodeSession({host: 'localhost',
      dbUser: 'root',
      dbPassword: 'mypasswd',
      ssl_ca: "path_to_ca_file",
      ssl_cert: "path_to_cert_file",
      ssl_key: "path_to_key_file"});
    mysql-js> print(session)
    <NodeSession:root@localhost>
    mysql-js>
    
    3.8.2.2.7. Глобальные переменные MySQL Shell

    MySQL Shell резервирует определенные переменные как глобальные, которые назначены обычно используемым объектам в скриптах. Этот раздел описывает доступные глобальные переменные и обеспечивает примеры работы с ними. Глобальные переменные:

    • session представляет глобальный сеанс, если он был установлен.

    • db представляет схему, если она была определена, например, через URI.

    MySQL Shell обеспечивает интерактивную расшифровку ошибок для общих ситуаций, связанных с использованием глобальных переменных. Например:

    • Попытка использовать неопределенную глобальную переменную session.

    • Попытка получить несуществующую схему через session.
    • Попытка использовать неопределенную глобальную переменную db.

    Неопределенный глобальный сеанс

    Глобальная переменная session установлена, когда глобальный сеанс установлен. Когда глобальный сеанс установлен, запрос session в MySQL Shell выводит на экран тип сеанса и его URI:

    mysql-js> session
    <XSession:root@localhost:33060>
    mysql-js>
    
    Если никакой глобальный сеанс не был установлен, MySQL Shell выводит на экран следующее:
    mysql-js> session
    <Undefined>
    mysql-js>
    
    Если Вы пытаетесь использовать переменную session, когда никакой глобальный сеанс не установлен, происходит ошибка, и будет запрошена информация для его создания. Если сеанс успешно установлен, он назначен переменной session. Надо иметь в виду, что:

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

    • Если Вы хотите установить глобальный сеанс, запрашивается тип сеанса.
    • URI или псевдоним сохраненного сеанса требуется.
    • Запрашивается пароль, если он нужен.

    Например:

    mysql-js> session.uri
    The global session is not set, do you want to establish a session? [y/N]: y
    Please specify the session type:
    
    1) X
    2) Node
    3) Classic
    
    Type: 2
    Please specify the MySQL server URI (or $slias): root@localhost
    Enter password:*******
    root@localhost:33060
    mysql-js>
    
    Неопределенная переменная db

    Глобальная переменная db установлена, когда глобальный сеанс установлен, и схема значения по умолчанию сконфигурирована. Например, используя URI как root@localhost/sakila устанавливается глобальный сеанс с сервером MySQL на localhost, порт 33060, пользователь root, схема sakila к глобальной переменной db. Как только схема определена, db в подсказке MySQL Shell печатает имя схемы следующим образом:

    mysql-js> db
    <Schema:world_x>
    mysql-js>
    
    Если нет никакого глобального установленного сеанса, следующее выведено на экран:
    mysql-js> db
    <Undefined>
    mysql-js>
    
    Если Вы пытаетесь использовать переменную db, когда никакой глобальный сеанс не был установлен, следующая ошибка выведена на экран:
    mysql-js> db.getCollections()
    LogicError: The db variable is not set, establish a global session first.
    at (shell):1:2
    in db.getCollections()
    ^
    
    Если глобальный сеанс был установлен, но Вы пытаетесь использовать неопределенную db, Вы будете запрошены относительно определения активной схемы, обеспечивая имя этой схемы. Если это получается, переменная db будет установлена в определенную схему. Например:
    mysql-js> db.getCollections()
    The db variable is not set, do you want to set the active schema? [y/N]:y
    Please specify the schema:world_x
    [
    <Collection:countryinfo>
    ]
    mysql-js> db
    <Schema:world_x>
    mysql-js>
    
    Получение несуществующей схемы

    Если Вы пытаетесь использовать session чтобы получить несуществующую схему, предоставляется возможность создать схему:

    mysql-js> var mySchema = session.getSchema('my_test')
    The schema my_test does not exist, do you want to create it? [y/N]: y
    
    mysql-js> mySchema
    <Schema:my_test>
    mysql-js>
    
    Во всех случаях, если Вы не предоставляете информацию, запрошенную, чтобы решить каждую проблему, на экран выведен надлежащий результат выполнения требуемого запроса о неопределенной переменной.

    3.8.3. Выполнение кода в MySQL Shell

    Этот раздел объясняет, как выполнение кода работает в MySQL Shell.

    3.8.3.1. Интерактивное выполнение кода

    Режим по умолчанию MySQL Shell обеспечивает интерактивное выполнение операций базы данных, которые Вы вводите в командной строке. Эти операции могут быть написаны на JavaScript, Питоне или SQL в зависимости от типа используемого сеанса. Когда задание выполнено, результаты работы выведены на экран.

    Как с любым другим языком, MySQL Shell очень строг относительно синтаксиса. Например, следующий отрывок JavaScript читает и печатает документы в наборе:

    var mysqlx = require('mysqlx').mysqlx;
    var mySession = mysqlx.getSession('user:pwd@localhost');
    var result = mySession.world_x.countryinfo.find().execute();
    var record = result.fetchOne();
    while(record) {
      print(record);
      record = result.fetchOne();
    }
    
    Как замечено выше, вызов find() сопровождается функцией execute(). Команды базы данных CRUD фактически выполнены на сервере MySQLтолько, когда вызван execute(). Однако, работая с MySQL Shell в интерактивном режиме, execute() неявно вызван всякий раз, когда Вы нажимаете Return. Тогда результаты работы получены и выведены на экран. Правила для того, когда Вы должны вызвать execute() сами, следующие:

    • Используя MySQL Shell таким образом, вызов execute() становится опциональным на:

      • Collection.add()

      • Collection.find()
      • Collection.remove()
      • Collection.modify()
      • Table.insert()
      • Table.select()
      • Table.delete()
      • Table.update()
      • NodeSession.sql()

    • Автоматическое выполнение отключено, если объект назначен переменной. В таком запросе вызовите execute() принудительно, чтобы выполнить работу.

    • Когда строка обработана, и функция возвращает любой из доступных объектов Result, информация, содержавшаяся в объекте Result, автоматически выведена на экран. Функции, которые возвращают объект Result, включают:

      • Выполнение SQL и операции CRUD (перечислены выше).

      • Операционная обработка и функции завершения сеансовых объектов в обоих модулях, mysql и mysqlx:

        • startTransaction()

        • commit()
        • rollback()
        • dropSchema()
        • dropTable()
        • dropCollection()
        • dropView()
        • ClassicSession.runSql()

    Исходя из вышеупомянутых правил, запросы, необходимые в MySQL Shell в интерактивном режиме, чтобы установить сеанс, запросить и напечатать документы в наборе, выглядят так:

    mysql-js> var mysqlx = require('mysqlx').mysqlx;
    mysql-js> var mySession = mysqlx.getSession('user:pwd@localhost');
    
    Вызов execute() не нужен, объект Result автоматически напечатан.
    mysql-js> mySession.world_x.countryinfo.find();
    

    3.8.3.2. Пакетное выполнение кода

    Так же, как интерактивное выполнение кода, MySQL Shell обеспечивает и пакетное выполнение кода из:

    • Файл, загруженный для обработки.

    • Файл, содержащий код, который перенаправлен к стандартному вводу для выполнения.
    • Код из другого источника, который перенаправлен к стандартному вводу для выполнения.

    Например:

    Загрузка SQL из файла для пакетной обработки данных.

    shell> mysqlsh --file code.js
    
    Перенаправление файла к стандартному вводу для выполнения.
    shell> mysqlsh < code.js
    
    Перенаправление кода к стандартному вводу для выполнения.
    shell> echo "show databases;" | mysqlsh --sql --uri root@192.168.1.141:33060
    
    Исполняемые скрипты

    Начиная с версии 1.0.4 в Linux Вы можете создать выполняемые скрипты, которые выполняются с помощью MySQL Shell добавлением в первую строку скрипта символа #!. Эта строка должна обеспечить весь путь к MySQL Shell и включать опцию --file, например так:

    #!/usr/local/mysql-shell/bin/mysqlsh --file
    print("Hello World\n");
    
    Файл скрипта должен быть отмечен как выполняемый в файловой системе. Выполнение скрипта вызывает MySQL Shell, и это выполняет содержание скрипта.

    3.8.3.3. Выходные форматы

    Вывод команд, обработанных на сервере, может быть отформатирован по-разному. Этот раздел детализирует различные доступные выходные форматы.

    3.8.3.3.1. Таблица

    Формат таблицы используется по умолчанию, когда MySQL Shell находится в интерактивном режиме. Вывод представлен как отформатированная таблица для лучшего представления и анализа.

    mysql-sql> select * from sakila.actor limit 3;
    +----------+------------+-----------+--------------------+
    | actor_id | first_name | last_name | last_update        |
    +----------+------------+-----------+--------------------+
    |1         | PENELOPE   | GUINESS   | 2006-02-15 4:34:33 |
    |2         | NICK       | WAHLBERG  | 2006-02-15 4:34:33 |
    |3         | ED         | CHASE     | 2006-02-15 4:34:33 |
    +----------+------------+-----------+--------------------+
    3 rows in set (0.00 sec)
    
    mysql-sql>
    
    Чтобы получить этот выходной формат, работая в пакетном режиме, используйте опцию --table.

    3.8.3.3.2. Разделение табуляциями

    Этот формат используется по умолчанию MySQL Shell в пакетном режиме, чтобы вывести данные для автоматизированного анализа.

    >echo "select * from sakila.actor limit 3;" | mysqlsh --classic --uri root@192.168.1.141:33460
    actor_idfirst_namelast_name last_update
    1 PENELOPE GUINESS  2006-02-15 4:34:33
    2 NICK     WAHLBERG 2006-02-15 4:34:33
    3 ED       CHASE    2006-02-15 4:34:33
    
    3.8.3.3.3. Формат вывода JSON

    MySQL Shell поддерживает формат JSON для вывода, это доступно в интерактивном и в пакетном режиме. Этот выходной формат может быть включен, используя опцию --json:

    Формат JSON в пакетном режиме:

    shell>echo "select * from sakila.actor limit 3;" | mysqlsh --json --sqlc --uri root@192.168.1.141:3306
    {"duration":"0.00 sec","info":"","row_count":3,"rows":[[1,"PENELOPE","GUINESS",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}],[2,"NICK","WAHLBERG",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}],[3,"ED","CHASE",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}]],"warning_count":0}
    
    shell>echo "select * from sakila.actor limit 3;" | mysqlsh --json=raw --sqlc --uri root@192.168.1.141:3306
    {"duration":"0.00 sec","info":"","row_count":3,"rows":[[1,"PENELOPE","GUINESS",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}],[2,"NICK","WAHLBERG",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}],[3,"ED","CHASE",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}]],"warning_count":0}
    
    shell>echo "select * from sakila.actor limit 3;" | mysqlsh --json=pretty --sqlc --uri root@192.168.1.141:3306
    {"duration": "0.00 sec", "info": "", "row_count": 3,
     "rows": [
     [1, "PENELOPE", "GUINESS",
      {"year": 2006, "month": 1, "day": 15, "hour": 4, "minute": 34,
       "second": 33.0}
     ],
     [2, "NICK", "WAHLBERG",
      {"year": 2006, "month": 1, "day": 15, "hour": 4, "minute": 34,
       "second": 33.0}
     ],
     [3, "ED", "CHASE",
      {"year": 2006, "month": 1, "day": 15, "hour": 4, "minute": 34,
       "second": 33.0}
     ]], "warning_count": 0
    }
    shell>
    
    Формат JSON в интерактивном режиме (запуск с --json=raw):
    mysql-sql> select * from sakila.actor limit 3;
    {"duration":"0.00 sec","info":"","row_count":3,"rows":[[1,"PENELOPE","GUINESS",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}],[2,"NICK","WAHLBERG",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}],[3,"ED","CHASE",{"year":2006,"month":1,"day":15,"hour":4,"minute":34,"second":33.0}]],"warning_count":0}
    
    mysql-sql>
    
    Формат JSON в интерактивном режиме (запуск с --json=pretty)
    mysql-sql> select * from sakila.actor limit 3;
    {"duration": "0.00 sec", "info": "", "row_count": 3,
     "rows": [
      [1, "PENELOPE", "GUINESS",
       {"year": 2006, "month": 1, "day": 15, "hour": 4, "minute": 34,
        "second": 33.0}
      ],
      [2, "NICK", "WAHLBERG",
       {"year": 2006, "month": 1, "day": 15, "hour": 4, "minute": 34,
        "second": 33.0}
      ],
      [3, "ED", "CHASE",
       {"year": 2006, "month": 1, "day": 15, "hour": 4, "minute": 34,
        "second": 33.0}
      ]
     ],"warning_count": 0
    }
    mysql-sql>
    
    3.8.3.3.4. Метаданные о результате

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

    • Формат JSON используется для вывода.

    • MySQL Shell работает в интерактивном режиме.

    3.8.3.4. Активный язык

    MySQL Shell может выполнить код на SQL, JavaScript или Питон, но только один язык может быть активным. Активный режим определяет, как именно обработаны исполняемые команды:

    • Используя режим SQL, запросы обработаны как SQL, что означает, что их посылают на сервер MySQL для выполнения.

    • Используя режим JavaScript, запросы обработаны как JavaScript.
    • Используя режим Python, запросы обработаны как Python.

    Выполняя MySQL Shell в интерактивном режиме, активируйте определенный язык, вводя команды: \sql, \js, \py.

    Выполняя MySQL Shell в пакетном режиме, активируйте определенный язык, передавая любой из этих параметров командной строки: --js, --py или --sql. Режимом по умолчанию, если ни один не определен, является JavaScript.

    Используйте MySQL Shell, чтобы выполнить контент файла code.sql как SQL:

    shell> mysqlsh --sql < code.sql
    

    Используйте MySQL Shell, чтобы выполнить контент файла code.js как JavaScript:

    shell> mysqlsh < code.js
    

    Используйте MySQL Shell, чтобы выполнить контент файла code.py как Python:

    shell> mysqlsh --py < code.py
    

    3.8.3.5. Как пакетный режим сделать интерактивным

    Этот раздел описывает выполнение кода в пакетном режиме.

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

    • Обработка запроса SQL использует следующую логику: чтение, выполнение, печать результата.
    • При обработке не-SQL кода, он загружен полностью из входного источника и выполнен как модуль.

    Используйте параметр командной строки --interactive (или -i), чтобы сконфигурировать MySQL Shell, чтобы обработать входной источник, как будто обработка запущена в интерактивном режиме: это активирует все опции, обеспеченные интерактивным режимом, который будет использоваться в пакетной обработке данных.

    В этом случае, независимо от того, что это за источник, он будет считан построчно и обработан интерактивно.

    3.8.3.5.1. Поддержка нескольких строк

    Возможно определить запросы из нескольких строк. При работе в режиме Питона или JavaScript, многострочный режим автоматически включен, когда блок запросов начинается с функциональных определений, условных операторов, циклов и так далее. В режиме SQL многострочный режим запускается, когда появляется команда \. Как только многострочный режим запущен, вводимые заявления кэшируются. Например:

    mysql-sql> \
    ... create procedure get_actors()
    ... begin
    ...   select first_name from sakila.actor;
    ... end
    ...
    mysql-sql>
    

    3.8.4. Конфигурирование MySQL Shell

    Этот раздел объясняет, как сконфигурировать MySQL Shell, используя команды выполнимые из интерактивного редактора кода и параметров командной строки. Для описания параметров командной строки MySQL Shell см. mysqlsh.

    3.8.4.1. Команды MySQL Shell

    MySQL Shell обеспечивает команды, которые позволяют Вам изменить окружающую среду выполнения редактора кода, например сконфигурировать активный язык программирования или соединение с MySQL Server. Следующая таблица приводит команды, которые доступны независимо от в настоящее время выбираемого языка. Поскольку команды должны быть доступными независимо от режима исполнения, они начинаются с escape-последовательности \.

    Команда ПсевдонимОписание

    \help

    \h или \?

    Справка о командах MySQL Shell.

    \quit

    \q или \exit

    Выход из MySQL Shell.

    \

    В режиме SQL включает многострочный режим. Код кэшируется и будет выполнен, когда вводится пустая строка.

    \status

    Показывает текущий статус MySQL Shell.

    \js

    Режим выполнения JavaScript.

    \py

    Режим выполнения Python.

    \sql

    Режим выполнения SQL.

    \connect

    \cx

    Соединится с сервером MySQL по URI, используя XSession (X Protocol).

    \connect_node

    \cn

    Удалено в версии 1.0.4, используйте \connect -n. Соединится с сервером MySQL по URI, используя Node session.

    \connect_classic

    \cc

    Удалено в версии 1.0.4, используйте \connect -c. Соединится с сервером MySQL по URI, используя Classic session (MySQL).

    \use

    Определяет схему, чтобы использовать.

    \source

    \.

    Выполнит файл скрипта, используя активный язык.

    \warnings

    \W

    Покажет любые предупреждения, произведенные запросом

    \nowarnings

    \w

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

    \lsconn

    \lsc

    Напечатать данные о соединении для сохраненных сеансов.

    \saveconn

    \savec

    Сохранить данные соединения сеанса, опционально используется -f, чтобы вызвать перезапись существующего соединения.

    \addconn

    \addc

    Удалено в версии 1.0.4, см. \saveconn. Сохранить данные соединения сеанса.

    \rmconn

    Удаляет сохраненный сеанс.

    \chconn

    Удалено в версии 1.0.4, см. \saveconn. Обновляет сохраненный сеанс.

    Команда Help

    Команда \help может использоваться с или без параметров. Когда используется без параметров, общая справка будет напечатана, включая информацию о:

    • Доступных командах.

    • Доступных командах для активного режима.

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

    • Описание.

    • Поддерживаемые псевдонимы, если есть.
    • Дополнительная справка, если есть.

    Например:

    \help connect
    
    Если параметр не является допустимой командой, общая справка напечатана.

    Команда Connect

    Команда \connect используется, чтобы соединиться с сервером MySQL, используя URI. Эта команда создает соединение через X Protocol по умолчанию. Например:

    \connect root@localhost:3306
    
    Если пароль требуется, он будет запрошен.

    Используйте опцию -n, чтобы создать Node session, используя X Protocol, чтобы соединиться с единственным сервером. Например:

    \connect -n root@localhost:3306
    
    Используйте опцию -c, чтобы создать Classic session, позволяющую использовать протокол MySQL, чтобы выполнять команды SQL непосредственно на сервере. Например:
    \connect -c root@localhost:3306
    
    Команда Source

    Команда \source используется, чтобы выполнить код из скрипта в данном пути. Например:

    \source /tmp/mydata.sql
    
    Это может использоваться, чтобы выполнить SQL, JavaScript или Python. Код в файле выполнен, используя активный язык, таким образом, чтобы обработать SQL, MySQL Shell должен быть в режиме SQL.

    Поскольку код выполнен, используя активный язык, выполняя скрипт на ином языке, чем в настоящее время выбранный, можно получить неожиданные результаты.

    Команда Use

    Команда \use позволяет Вам выбрать, какая схема является активной, например:

    \use schema_name
    
    Команда \use требует, чтобы глобальный сеанс был активным. Если глобальный сеанс XSession, команда \use только устанавливает db к объекту, представляющему schema_name, но не устанавливает текущую схему на базе данных. Если глобальный сеанс NodeSession или ClassicSession, команда \use устанавливает текущую схему в указанную schema_name и обновляет переменную db к объекту, который представляет выбранную схему.

    3.8.5. Сохраненные сеансы

    Этот раздел описывает, как MySQL Shell хранит постоянный список данных о соединении для сеансов, идентифицированных именем сеанса.

    Есть два подхода, чтобы управлять и использовать сохраненные данные соединения:

    • Через команды MySQL Shell.

    • Через встроенный объект, доступный для JavaScript и Python.

    С этими опциями Вы можете добавить, обновить, удалить, перечислить и использовать хранящие данные соединения. Соединения сохранены как текстовый файл в каталоге MySQL Shell, обычно находящемся в пользовательском каталоге.

    Имя файла: stored_sessions.json

    В Windows типичное местоположение:

    %APPDATA%\MySQL\mysqlsh\stored_sessions.json
    
    В Unix типичное местоположение:
    ~/.mysqlsh/stored_sessions.json
    

    3.8.5.1. Сохраненные команды сеанса MySQL Shell

    Следующие команды используются, чтобы работать с сохраненными сеансами в MySQL Shell.

    Добавление соединения

    Добавить данные о соединении для использования сеанса:

    \saveconn name [URI]
    
    • name: Важный параметр, имя, которое назначено соединению. Отметьте, что это должно быть допустимым идентификатором:

      • Начинается с буквенного символа.

      • Содержит только алфавитно-цифровые символы и подчеркивание.
    • URI: Дополнительный параметр, содержащий данные о соединении в формате URI. Если не определен, и глобальный сеанс является активным, URI для глобального сеанса используется вместо этого.

    • -f: Дополнительный параметр, чтобы вызвать перезапись существующего соединения. Если предпринята попытка сохранить соединение, но name занято, происходит ошибка. Используйте этот параметр, чтобы вызвать сохранение соединения, которое переопределяет то, что было ранее сохранено под данным именем сеанса.

    Обновление сохраненного соединения

    Чтобы обновить данные о соединении для определенного сеанса:

    \saveconn -f name URI
    
    • name: Имя соединения.

    • URI: Содержит данные о соединении, которые заменяют соединение для обозначенного имени сеанса.

    Удаление сохраненного соединения

    Удалить соединение можно так:

    \rmconn name
    
    • name: Имя соединения.

    Просмотр списка соединений

    Чтобы просмотреть перечень соединений, скомандуйте:

    \lsconn
    
    Использование сохраненного соединения

    Сохраненные соединения могут использоваться, чтобы создать глобальный сеанс командой \connect name. Сохраненный сеанс загружен и используется, чтобы создать глобальный сеанс. При использовании сохраненного соединения посредством команды оболочки, Вы будете запрошены о пароле, если он отсутствует в данных соединения.

    3.8.5.2. Скрипты сохраненных сеансов

    Встроенный объект доступен, чтобы управлять и использовать сохраненные соединения через JavaScript или Python: shell.storedSessions.

    3.8.5.2.1. Добавление сохраненного соединения

    Добавить новое соединение можно так:

    shell.storedSessions.add(name, connectionData[, override])
    
    • name: Имя соединения. Это должно быть допустимым идентификатором.

    • connectionData: Содержит информацию о соединении и может быть или строкой в формате URI, или картой данных о соединении, содержащей любое из следующих значений:

      • Хост.

      • Порт.
      • dbUser
      • dbPassword
      • Схема.
      • ssl_ca
      • ssl_cert
      • ssl_key

        Чтобы сохранить данные соединения, по крайней мере параметры хост и dbUser должны быть определены, остальные дополнительные.

    • override: Дополнительный булев параметр, используемый, чтобы указать на желаемое поведение в случае, если уже есть данные соединения, связанные с тем же самым именем. Значение по умолчанию: false.

      • Если override = false, а данные о соединении с тем же самым именем уже существуют, произойдет ошибка.

      • В том же самом скрипте, если новые данные о соединении переопределяют предыдущие данные, ошибки не будет.

    3.8.5.2.2. Обновление сохраненного соединения

    Чтобы обновить данные о соединении для определенного сеанса:

    shell.storedSessions.update(name, connectionData)
    
    • name: Имя, которое идентифицирует данные о соединении. Отметьте, что это должно быть допустимым идентификатором.

    • connectionData: Содержит данные о соединении и может быть или строкой в формате URI, или картой данных о соединении.

    3.8.5.2.3. Удаление сохраненного соединения

    Чтобы удалить соединение:

    shell.storedSessions.remove(name)
    
    • name: Имя соединения, которое будет удалено.

    3.8.5.2.4. Перечисление сохраненных соединений

    Чтобы получить список сохраненных соединений, используйте:

    shell.storedSessions
    
    3.8.5.2.5. Использование сохраненного соединения

    Когда объект shell.storedSessions инициализирован, он загружает данные сеанса и создает свойство, чтобы получить доступ к ним как shell.storedSessions.name:

    var session = mysqlx.getSession(shell.storedSessions.name)
    
    Когда используется этот путь, если у данных о соединении нет никакого пароля, его не требуют. Обязанность разработчиков обеспечить пароль используя данные сеанса или как дополнительный параметр следующим образом:
    var session = mysqlx.getSession(shell.storedSessions.name, password)
    

    3.8.6. Журнал приложения MySQL Shell

    Этот раздел объясняет журнал приложения.

    3.8.6.1. Журнал приложения

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

    Местоположение файла системного журнала: пользовательский путь конфигурации, сам файл называется mysqlsh.log.

    Файл системного журнала в Windows

    В Windows путь по умолчанию к файлу системного журнала %APPDATA%\MySQL\mysqlsh\mysqlsh.log.

    Найти местоположение %APPDATA% на Вашей системе можно так:

    C:>echo %APPDATA%
    C:\Users\exampleuser\AppData\Roaming
    
    В Windows путь определен результатом объединения пути к папке %APPDATA% для пользователя и MySQL\mysqlsh. Используя вышеупомянутый пример, мы получим:
    C:\Users\exampleuser\AppData\Roaming\MySQL\mysqlsh\mysqlsh.log
    
    Файл системного журнала в Unix-системах

    Для Unix путь по умолчанию ~/.mysqlsh/mysqlsh.log, где ~ представляет корневой каталог пользователя. Переменная окружения HOME также представляет корневой каталог пользователя. Добавление .mysqlsh к корневому каталогу пользователя определяет путь по умолчанию к журналам. Например:

    C:>echo $HOME
    /home/exampleuser
    shell> less /home/exampleuser/.mysqlsh/mysqlsh.log
    
    Эти пути могут быть переопределены на всех платформах, определяя переменную окружения MYSQL_USER_CONFIG_PATH. Значение этой переменной заменяет %APPDATA% в Windows или $HOME в Unix.

    По умолчанию журналирование отключено в MySQL Shell. Чтобы включить его, примените параметр командной строки --log-level, запуская MySQL Shell. Например:

    shell> mysqlsh --log-level=4
    
    Число, назначенное --log-level управляет уровнем детализации в журнале. Следующие уровни журналирования поддержаны:

    Уровень журналирования Значение

    1

    Ничего, значение по умолчанию.

    2

    Внутренняя ошибка.

    3

    Ошибка.

    4

    Предупреждение.

    5

    Информация.

    6

    Отладка.

    7

    Отладка2.

    8

    Отладка3.

    Формат журнала простой текст, записи содержат метку времени и описание проблемы, наряду с уровнем журнала из вышеупомянутого списка. Например:

    2016-04-05 22:23:01: Error: Default Domain: (shell):1:8: MySQLError: You have an error
    in your SQL syntax; check the manual that corresponds to your MySQL server version for
    the right syntax to use near '' at line 1 (1064) in session.sql("select * from t
    limit").execute().all();
    

    3.8.7. Настройка MySQL Shell

    MySQL Shell предлагает настроить поведение и среду выполнения кода через скрипты запуска, которые выполнены, когда приложение запускается. Это позволяет сделать следующее:

    • Добавить дополнительные пути поиска для модулей Python или JavaScript.

    • Переопределить подсказку по умолчанию, используемую режимами Python и JavaScript.
    • Определить глобальные функции или переменные.
    • Любую другую возможную инициализацию через JavaScript или Python.

    3.8.7.1. Работа со стартовыми скриптами

    Когда MySQL Shell входит в режим JavaScript или Питона, он ищет скрипты запуска, которые будут выполнены. Это скрипты на JavaScript или Python содержащие инструкции, которые будут выполнены, когда соответствующий режим инициализирован.

    Скрипты запуска нужно назвать следующим образом:

    • Для JavaScript: mysqlshrc.js

    • Для Python: mysqlshrc.py

    MySQL Shell ищет эти файлы по следующим путям (в порядке выполнения).

    В Windows:

    1. %PROGRAMDATA%MySQLmysqlshmysqlshrc.[js|py]

    2. %MYSQLSH_HOME%sharedmysqlshmysqlshrc.[js|py]
    3. <mysqlsh binary path>mysqlshrc.[js|py]
    4. %APPDATA%MySQLmysqlshmysqlshrc.[js|py]

    В Linux и OSX:

    1. /etc/mysql/mysqlsh/mysqlshrc.[js|py]

    2. $MYSQLSH_HOME/shared/mysqlsh/mysqlshrc.[js|py]
    3. <mysqlsh binary path>/mysqlshrc.[js|py]
    4. $HOME/.mysqlsh/mysqlshrc.[js|py]

    Переменная окружения MYSQLSH_HOME определяет корневой каталог стандартной установки MySQL Shell. Если MYSQLSH_HOME не определена, это будет автоматически вычислено, основываясь на местоположении исполняемого файла MySQL Shell, поэтому на многих стандартных установках нет необходимости определять MYSQLSH_HOME отдельно.

    Если MYSQLSH_HOME не определена и исполняемый файл MySQL Shell не находится в стандартной структуре папок установки, тогда путь, определенный в опции 3 в вышеупомянутых списках, используется. Используя стандартную установку или если MYSQLSH_HOME указывает на стандартную структуру папок установки, тогда путь, определенный в опции 3, не используется. Списки выше также определяют порядок поиска путей, если что-то определено в двух различных скриптах. Скрипт, выполняемый позже, имеет приоритет.

    3.8.7.2. Добавление путей поиска модуля

    Есть два способа добавить дополнительные пути поиска модуля:

    • Через переменные окружения.

    • Через стартовые скрипты.

    3.8.7.2.1. Переменные окружения

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

    • Символ двоеточия в Linux и OSX.

    • Символ точки с запятой в Windows.

    Чтобы достичь этого в JavaScript MySQL Shell поддерживает дополнительные пути модуля JavaScript, используя переменную окружения MYSQLSH_JS_MODULE_PATH. Значение этой переменной представляет собой список путей, отделенных точкой с запятой.

    3.8.7.2.2. Стартовые скрипты

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

    Для Python поправьте файл mysqlshrc.py и добавьте необходимые пути в массив sys.path.

    # Import the sys module
    import sys
    
    # Append the additional module paths
    sys.path.append('~/custom/python')
    sys.path.append('~/other/custom/modules')
    
    Для JavaScript та же самая задача решается добавлением кода в файл mysqlshrc.js, чтобы добавить необходимые пути в предопределенный массив shell.js_module_paths.
    // Append the additional module paths
    shell.js.module_paths[shell.js.module_paths.length] = '~/custom/js';
    shell.js.module_paths[shell.js.module_paths.length] = '~/other/custom/modules';
    

    3.8.7.3. Переопределение подсказки по умолчанию

    MySQL Shell использует свою подсказку по умолчанию для обоих языков: для Python (mysql-py>) и для JavaScript (mysql-js> ).

    Вы можете настроить подсказку для каждого языка, используя функцию shell.custom_prompt(). Эта функция должна возвратить строку, которая используется в качестве подсказки. Чтобы иметь пользовательскую подсказку при запуске MySQL Shell, определите эту функцию в скрипте запуска. Следующий пример показывает, как эта функциональность может использоваться.

    В Python shell.custom_prompt() может быть определена как:

    # Import the sys module
    from time import gmtime, strftime
    
    def my_prompt():
      ret_val = strftime("%H:%M:%S", gmtime())
      if session and session.isOpen():
         data = shell.parseUri(session.getUri())
         ret_val = "%s-%s-%s-py> " % (ret_val, data.dbUser, data.host)
      else: ret_val = "%s-disconnected-py> " % ret_val
      return ret_val
      shell.custom_prompt = my_prompt
    

    В JavaScript shell.custom_prompt() может быть определена как:

    shell.custom_prompt = function()
    {
      var now = new Date();
      var ret_val = now.getHours().toString()+ ":" +
                    now.getMinutes().toString() + ":" +
                    now.getSeconds().toString();
      if (session && session.isOpen()) {
         var data = shell.parseUri(session.getUri());
         ret_val += "-" + data.dbUser + "-" + data.host + "-js> ";
      }
      else ret_val += "-disconnected-js> ";
      return ret_val;
    }
    
    Следующий пример демонстрирует использование пользовательских функций, определенных выше в скрипте запуска. Подсказки показывают время текущей системы, а если сеанс открыт, текущего пользователя и хост:
    Welcome to MySQL Shell 1.0.4 Development Preview
    
    Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of
    their respective owners.
    
    Type '\help', '\h' or '\?' for help.
    
    Currently in JavaScript mode. Use \sql to switch to SQL mode and execute queries.
    14:34:32-disconnected-js> \py
    Switching to Python mode...
    
    19:34:39-disconnected-py> \connect root:@localhost
    Creating an X Session to root@localhost:33060
    No default schema selected.
    
    19:34:50-root-localhost-py> \js
    Switching to JavaScript mode...
    14:34:57-root-localhost-js>
    

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru