Поиск по сайту:

Проверка значения в базе данных MySQL из сценария Linux Bash


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

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

Запуск SQL-запросов из сценария Bash

Синтаксис запуска внутри скрипта bash такой же, как и при доступе к базе данных из командной строки:

mysql -u root -pPassword -h hostname -D dbname -e 'query'

Если ваша база данных работает локально, флаг -h можно не указывать. Если вы используете базу данных разработки, вы можете опустить флаг -p, если у вашей базы данных нет пароля.

Это выведет результаты запроса в STDOUT, которые вы можете передать в файл:

mysql -u root -D dbname -e 'SELECT * FROM table' > file

…или сохранить в переменной с конструкцией $ ( ) :

variable=$(mysql -u root -D dbname -e 'SELECT * FROM table')

Но по умолчанию вывод будет не очень красивым, поэтому вы можете упростить работу с ним, используя флаг -B для печати в формате значений, разделенных табуляцией (TSV), и -N флаг, чтобы пропустить заголовки столбцов.

Файлы TSV являются менее используемыми родственниками файлов CSV, которые вы можете преобразовать из командной строки.

Проверка конкретного значения и ветвление

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

field=$(mysql -u root -BNe 'USE test; SELECT label FROM test WHERE id=1')

if [ $field == 'TEST' ]; then
    //do stuff
fi

Это работает только тогда, когда вы запрашиваете конкретное значение и выполняете простое сравнение. Если вам нужно больше манипуляций, чем предоставляет bash, вы можете использовать awk, который может выделять отдельные столбцы из текста и выполнять сравнения:

if [ $(echo $field | awk '{if ($1 == value && $2 == value2) print 1; else print 0}') == "1" ]; then
    //do stuff
fi

Здесь команда awk выводит true или false (1 или 0), которые bash if может использовать для сравнения и ветвления.

В обоих этих примерах предполагается, что ваш SQL-запрос возвращает только одну строку, в чем вы можете убедиться, выбрав на основе идентификатора. Но если вы выполняете более сложный запрос, вы можете ограничить ответ первой строкой с помощью команды SQL LIMIT 1.

Проверка ошибок: проверьте, существует ли база данных или таблица

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

Команда SQL USE dbname выдаст ошибку, если dbname не существует (код возврата > 0). Вы можете использовать это в блоке if, чтобы проверить, правильно ли настроена база данных:

if mysql -u root -e 'USE mydbname'; then
  
    //database exists, do stuff

fi

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

Точно так же вы можете проверить, существуют ли таблицы, попытавшись получить доступ к первой строке:

if mysql -u root -e 'USE mydbname; SELECT * FROM tablename LIMIT 1'; then

   //database and table exist, do more stuff

fi

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