Kontrolloni një vlerë në një bazë të dhënash MySQL nga një skript Linux Bash
Ju mund t'i bëni skriptet tuaja bash të ekzekutohen ndryshe bazuar në përmbajtjen e një baze të dhënash MySQL duke u lidhur me të nga linja e komandës dhe duke kaluar një pyetje, të cilën mund ta përdorni në blloqet if
për të degëzuar bazuar në një vlerë.
Shënim: Shembujt tanë tregojnë përdorimin e përdoruesit rrënjë në MySQL, por ju do të dëshironit të zëvendësoni një llogari tjetër përdoruesi atje.
Drejtoni pyetjet SQL nga një skript Bash
Sintaksa për ekzekutimin brenda një skripti bash është e njëjtë me aksesin në një bazë të dhënash nga vija e komandës:
mysql -u root -pPassword -h hostname -D dbname -e 'query'
Nëse baza juaj e të dhënave funksionon në nivel lokal, mund të hiqni flamurin -h
. Nëse keni një bazë të dhënash zhvillimi, mund të hiqni flamurin -p
nëse baza juaj e të dhënave nuk ka fjalëkalim.
Kjo do të nxjerrë rezultatet e pyetjes në STDOUT, të cilën mund ta dërgoni në një skedar:
mysql -u root -D dbname -e 'SELECT * FROM table' > file
…ose ruani në një variabël me konstruktin $ ( )
:
variable=$(mysql -u root -D dbname -e 'SELECT * FROM table')
Por, prodhimi nuk do të jetë shumë i bukur si parazgjedhje, kështu që mund ta bëni më të lehtë punën me të duke përdorur flamurin -B
për të printuar në formatin e vlerave të ndara me skeda (TSV) dhe -N
flamuri për të hequr titujt e kolonave.
Skedarët TSV janë kushëriri më pak i përdorur i skedarëve CSV, të cilët mund t'i konvertoni nga linja e komandës.
Kontrollimi i një vlere specifike dhe degëzimi
Nëse dëshironi të degëzoni bazuar në një vlerë në bazën e të dhënave tuaja, mund të kërkoni për rreshtin dhe kolonën specifike dhe ta ruani përgjigjen në një variabël. Më pas mund të përdorni një bllok bash if
për të degëzuar bazuar në përmbajtjen e asaj ndryshore.
field=$(mysql -u root -BNe 'USE test; SELECT label FROM test WHERE id=1')
if [ $field == 'TEST' ]; then
//do stuff
fi
Kjo funksionon vetëm kur po kërkoni një vlerë specifike dhe po kryeni një krahasim të thjeshtë. Nëse keni nevojë për më shumë manipulime sesa ofron bash, mund të përdorni awk
, i cili mund të zgjedhë kolona individuale nga teksti dhe të kryejë krahasime:
if [ $(echo $field | awk '{if ($1 == value && $2 == value2) print 1; else print 0}') == "1" ]; then
//do stuff
fi
Këtu, komanda awk
shtyp true ose false (1 ose 0), të cilën bash if
mund ta përdorë për të krahasuar dhe degëzuar.
Të dy këta shembuj supozojnë se pyetja juaj SQL po kthen vetëm një rresht të vetëm, të cilin mund ta siguroni duke zgjedhur bazuar në ID. Por nëse po ekzekutoni një pyetje më komplekse, mund të dëshironi të kufizoni përgjigjen në rreshtin e parë me komandën SQL LIMIT 1
.
Kontrollimi i gabimit: Verifikoni nëse ekziston një bazë të dhënash ose tabelë
Ndërsa ju me siguri po e shkruani këtë skript posaçërisht për serverin tuaj, një kontroll i vogël i gabimeve nuk ka lënduar kurrë askënd. Ju do të dëshironi të verifikoni që baza e të dhënave dhe tabelat me të cilat do të punoni ekzistojnë në të vërtetë përpara se të ngatërroni me to. Gjithashtu, nëse lidhja me bazën e të dhënave nuk funksionon, ajo do të dështojë edhe këtu.
Komanda SQL USE dbname
do të prodhojë një gabim nëse dbname
nuk ekziston (kodi i kthimit > 0). Ju mund ta përdorni këtë në një bllok if
për të kontrolluar nëse baza e të dhënave është konfiguruar siç duhet:
if mysql -u root -e 'USE mydbname'; then
//database exists, do stuff
fi
Mund ta përmbysësh bllokun if
duke e nisur boolean-in me një !
, i cili do ta ekzekutojë kodin vetëm kur baza e të dhënave nuk është konfiguruar, gjë që është e dobishme për të bërë konfigurimin për herë të parë. .
Në mënyrë të ngjashme, mund të kontrolloni nëse tabelat ekzistojnë duke u përpjekur të hyni në rreshtin e parë:
if mysql -u root -e 'USE mydbname; SELECT * FROM tablename LIMIT 1'; then
//database and table exist, do more stuff
fi
Për shkak se blloku if
kontrollon kodin e kthimit të çfarëdo komande që futni në të dhe komandat MySQL do të kthejnë një kod gabimi nëse hasin probleme, mund të përdorni çdo komandë në një if kodi> blloko në llogari për gabime.