Это действительно зависит от формата user_ids_txt. Если мы предположим, что это просто правильный синтаксис для вашего оператора SQL in
, сработает следующее:
#! /bin/bash
mysql -u user-ppassword db -e "update device set in_use=0 where user_id in ($(< /opt/test/user_ids_txt))";
Интерпретатор bash подставит содержимое файла. Это может быть опасно для SQL запросов, поэтому я бы вывел команду на терминале, чтобы убедиться, что она правильная, прежде чем ее реализовать. Вы сможете просмотреть запрос SQL, просто запустив в командной строке следующую команду:
echo "update device set in_use=0 where user_id in ($(< /opt/test/user_ids_txt))"
Если ваш файл не имеет синтаксиса SQL in
, вам необходимо его отредактировать. (или его копию) перед выполнением запроса. Я бы порекомендовал что-то вроде sed
для этого.
Пример
Допустим, ваш файл /opt/test/user_ids_txt
представляет собой просто список user_ids в формате:
aaa
bbb
ccc
Вы можете использовать sed
для редактирования этого в правильный синтаксис SQL:
sed 's/^/\'/g; s/$/\'/g; 2,$s/^/,/g' /opt/test/user_ids_txt
Вывод этой команды будет:
'aaa'
,'bbb'
,'ccc'
Если вы посмотрите на эту команду sed
, вы увидите 3 отдельные команды, разделенные точкой с запятой. Отдельные команды преобразуются в:
1: добавить '
в начало каждой строки
2: добавить '
в конец каждой строки
3: Добавьте ,
в начало каждой строки, кроме первой
Примечание. Если ваши идентификаторы имеют строгое число c, вам нужна только третья команда.
Это сделает ваш SQL query translate to:
update device set in_use=0 where user_id in ('aaa'
,'bbb'
,'ccc')
Вместо того, чтобы создать временный файл для его хранения, я бы использовал переменную bash и просто вставил ее в запрос следующим образом:
#! /bin/bash
in_statement="$(sed 's/^/\'/g; s/$/\'/g; 2,$s/^/,/g' /opt/test/user_ids_txt)"
mysql -u user-ppassword db -e "update device set in_use=0 where user_id in (${in_statement})";