Wczoraj znajomy poprosił mnie o pomoc – chodziło o wykonanie operacji na bazie MySQL z poziomy skryptu (bash) w Linuxie.
Pomocy oczywiście udzieliłem – akurat wiedziałem jak, i jak to często bywa – przy tej okazji pojawił się pomysł na krótki wpis. A, że temat świeży, to zamiast trafić na obszerną (stety/niestety ;-)) listę „zagadnień/tematów do opisania” leci bezpośrednio do Was, czyli na nasze łamy…
Spis treści w artykule
Polecenia MySQL w skryptach Linux/BASH
Metod na wykonanie kodu/zapytania SQL z poziomu skryptu jest pewnie kilka, ja skoncentruje się na moim zdaniem najprostszej, a przynajmniej takiej, która u mnie zawsze działa.
Na potrzeby tego poradnika wykorzystam polecenie/zapytanie które kiedyś demonstrowałem przy okazji poradnika dotyczącego hurtowego kasowania komentarzy (w tym SPAMu) z WordPressa:
DELETE FROM NAZWA_BAZY_DANYCH.wp_comments WHERE comment_approved = "spam";
Nasze polecenie musimy teraz ubrać w kod, który sprawi, że będzie możliwe wykonanie tego polecenia w skrypcie:
#!/bin/bash
mysql -u UŻYTKOWNIK -pHASŁO <<EOF
[...]
EOF
Co daje nam taki kod:
#!/bin/bash
mysql -u UŻYTKOWNIK -pHASŁO <<EOF
DELETE FROM NAZWA_BAZY_DANYCH.wp_comments WHERE comment_approved = "spam";
EOF
Mam nadzieję, że oczywiste jest, że:
- Zamiast „UŻYTKOWNIK” podajemy nazwę użytkownika MySQL z odpowiednimi uprawnieniami
- Zamiast „HASŁO” podajemy hasło dla wybranego użytkownika MySQL
- Zamiast „NAZWA_BAZY_DANYCH” podajemy nazwę bazy danych, na której chcemy wykonać operacje
Powyższy skrypt po uruchomieniu (i wcześniejszym podaniu nazwy użytkownika, hasła i nazwy bazy danych) spowoduje skasowanie wszystkich komentarzy oznaczonych jako SPAM w naszej stronie opartej o WordPressa.
Gdy nie wiesz jaki skonstruować polecenie – phpMyAdmin Ci pomoże
A teraz coś, o czym nawet bardziej doświadczeni wyjadacze zapominają – za pomocą phpMyAdmin możemy sobie wygenerować zapytanie/polecenie MySQL do późniejszego wykorzystania, co przydaje się zwłaszcza w przypadku bardziej skomplikowanych operacji, i często pozwala zaoszczędzić sporo czasu.
Po wykonaniu dowolnej operacji na bazie z poziomu phpMyAdmin oprócz informacji o wyniku tej operacji, otrzymamy też podgląd wykonanej operacji w formie kodu/zapytania MySQL:
UPDATE `NAZWA_BAZY_DANYCH`.`wp_posts` SET `post_title` = 'Art. 213 KK TEST' WHERE `wp_posts`.`ID` =8;
Na powyższym przykładzie była to zmiana nazwy posta o ID=8 na „Art. 213 KK TEST” w bazie danych „NAZWA_BAZY_DANYCH” i tabeli „wp_posts”.
Zmiana kodu MySQL na Linux/BASH
Przed wstawieniem powyższego kodu do naszego skryptu musimy go trochę „zmodyfikować”, co tak naprawdę (w większości przypadków, przynajmniej tych mniej skomplikowanych) sprowadza się do usunięcia „grawisów” (akcent, backticks backquotes) z kodu:
UPDATE NAZWA_BAZY_DANYCH.wp_posts SET post_title = 'Art. 213 KK' WHERE wp_posts.ID=8;
W rezultacie czego otrzymujemy taki skrypt:
#!/bin/bash
mysql -u UŻYTKOWNIK -pHASŁO <<EOF
UPDATE NAZWA_BAZY_DANYCH.wp_posts SET post_title = 'Art. 213 KK' WHERE wp_posts.ID=8;
EOFF
I to właściwie tyle, pamiętajcie tylko, by przed eksperymentami zrobić kopie zapasową bazy danych – nawet, gdy wydaje się Wam, że wiecie co robicie… :-)
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
A patrząc od strony użytkowej, takie „sklejki” skryptowe (z mysql) lepiej robić w bashu, czy w czymś „nowszym” jak np. Python? Co lepiej wypada pod względem optymalizacji czy możliwości języka.
Pewnie zależy od tego ile i jakie będą to zapytania, ale nigdy nie testowałem jaka jest różnica (jeśli w ogóle jest) w tego typu operacjach – Bash kontra np. Python. Mogę ew. opierać się na innego typu operacjach i np. Raspberry Pi, gdzie przy bardziej rozbudowanej komunikacji po GPIO jest jakaś różnica, ale nie ma ona raczej wpływu na komfort pracy. Ja stosuje Basha, bo czuje się bardziej administratorem niż programistą :-)
Ale patrząc, iż jestem zielony w obu językach i będę musiał operować raczej na nowszych zastosowaniach (połączenie z MySQL, parsowanie JSON/XML, operacje na tabelach) to sensowniejsze wydaje mi się od początku wejście raczej w jakiś język programowania np tego Pythona.
Tak, w takim przypadku – jak i tak musisz się uczyć „od zera” – to sensowniejszy wydaje się chyba faktycznie jakiś bardziej złożony język, choćby właśnie Python – dodatkowo jest to dość uniwersalny język.