Controleer een waarde in een MySQL-database vanuit een Linux Bash-script

0
156

U kunt uw bash-scripts anders laten werken op basis van de inhoud van een MySQL database door er verbinding mee te maken vanaf de opdrachtregel en een query door te geven, die u kunt gebruiken in if-blocks om te vertakken op basis van een waarde.

Opmerking: onze voorbeelden laten zien dat u de root-gebruiker op MySQL gebruikt, maar u zou wil daar een ander gebruikersaccount vervangen.

Sql-query's uitvoeren vanuit een bash-script

De syntaxis voor het uitvoeren in een bash-script is hetzelfde als toegang krijgen tot een database vanaf de opdrachtregel:

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

Als uw database lokaal wordt uitgevoerd, kunt u de vlag -h weglaten. Als u een ontwikkelingsdatabase gebruikt, kunt u de vlag -p weglaten als uw database geen wachtwoord heeft.

Hierdoor worden de resultaten van de query uitgevoerd naar STDOUT, die u naar een bestand kunt pipen:

mysql -u root -D dbname -e 'SELECT * FROM tabel' > bestand

…of opslaan in een variabele met de $( ) constructie:

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

Maar de uitvoer zal standaard niet erg mooi zijn, dus u kunt het gemakkelijker maken om mee te werken door de -B-vlag te gebruiken om af te drukken in Tab-gescheiden waarden (TSV) -indeling en de -N-vlag om kolomkoppen weg te laten.

TSV-bestanden zijn het minder gebruikte neefje van CSV-bestanden , die u vanaf de opdrachtregel kunt converteren.

Een specifieke waarde en vertakking controleren

Als u wilt vertakken op basis van een waarde in uw database, kunt u de specifieke rij en kolom opvragen en het antwoord opslaan in een variabele. U kunt dan een bash if block to branch gebruiken op basis van de inhoud van die variabele.

field=$(mysql -u root -BNe 'USE test; SELECT label FROM test WHERE id=1') if [ $field == 'TEST' ]; dan //doe dingen fi

Dit werkt alleen wanneer u een specifieke waarde opvraagt ​​en een eenvoudige vergelijking uitvoert. Als je meer manipulatie nodig hebt dan bash biedt, kun je awk gebruiken, waarmee afzonderlijke kolommen uit tekst kunnen worden geselecteerd en vergelijkingen kunnen worden uitgevoerd:

if [ $(echo $field | awk '{if ($1 == value &&amp ; $2 == waarde2) print 1; else print 0}') == “1” ]; dan //do stuff fi

Hier drukt het awk-commando true of false (1 of 0) af, dat de bash if kan gebruiken om te vergelijken en te vertakken.

Beide voorbeelden gaan ervan uit dat uw SQL-query slechts één rij retourneert, wat u kunt verzekeren door te selecteren op basis van ID. Maar als u een complexere query uitvoert, kunt u de reactie beperken tot de eerste rij met het SQL-commando LIMIT 1.

GERELATEERD: Een CSV-bestand exporteren vanaf de MySQL-opdrachtregel

Foutcontrole: controleren of er een database of tabel bestaat

Hoewel je dit script waarschijnlijk speciaal voor je server schrijft, heeft een beetje foutcontrole nooit iemand kwaad gedaan. U zult willen controleren of de database en tabellen waarmee u gaat werken echt bestaan ​​voordat u ermee gaat rommelen. Als de verbinding met de database niet werkt, wordt hier ook een foutmelding gegeven.

Advertentie

Het SQL-commando 'USE dbname' geeft een fout als dbname het niet doet ;t bestaat (retourcode > 0). U kunt dit in een if-blok gebruiken om te controleren of de database correct is geconfigureerd:

if mysql -u root -e 'USE mydbname'; dan bestaat //database, do stuff fi

Je kunt het if-blok omkeren door de boolean te starten met een !, die de code alleen uitvoert als de database niet is geconfigureerd, wat handig is voor de eerste keer instellen .

Op dezelfde manier kunt u controleren of tabellen bestaan ​​door te proberen toegang te krijgen tot de eerste rij:

if mysql -u root -e 'USE mydbname; SELECT * FROM tabelnaam LIMIT 1'; dan bestaan ​​//database en tabel, doe meer dingen fi

Omdat het if-blok de retourcode controleert van welk commando dan ook dat je erin stopt, en MySQL-commando's een foutcode retourneren als ze problemen tegenkomen, kun je elk commando gebruiken in een if-blok om fouten te voorkomen.