ubuntuusers.de

SQL Abfragen in Bash Skript

Status: Gelöst | Ubuntu-Version: Ubuntu 19.10 (Eoan Ermine)
Antworten |

robin_b

Anmeldungsdatum:
17. April 2020

Beiträge: Zähle...

Hallo,

ich würde gerne in einem Bash-Skript die Ergebnisse von einer Datenbankabfrage in eine Variable schreiben. Außerdem würde ich das ganze gerne auch umgekehrt machen, also einen Wert aus dem Skript in die Datenbank schreiben.

Wichtig ist hierbei, dass die Datenbank auf einem anderen Server läuft.

Hat jemand eine Idee wie ich das umsetzen könnte? Habe zu dem Thema bisher nichts hilfreiches gefunden.

Vielen Dank,

Robin

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Das kannst du über mysql machen. Das Programm akzeptiert Port und Hostnamen als Argumente.

robin_b

(Themenstarter)

Anmeldungsdatum:
17. April 2020

Beiträge: 11

Danke für die schnelle Antwort.

Die Abfrage funktioniert bei mir jetzt auch mit:

1
mysql --host=XXX --database XXX-u XXX -e "SELECT 'kunde' FROM XXX" -p

Als Ausgabe erhalte ich dann allerdings nicht alle Kunden sondern folgendes:

1
2
3
4
5
6
7
8
9
+-------+
| kunde |
+-------+
| kunde |
| kunde |
| kunde |
| kunde |
| kunde |
+-------+

Woran kann das liegen?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Schau dir mal die Argumente -s (Ausgabe ohne das Ascii-Grid) und -N (Ausgabe ohne Kopfzeile) für mysql an.

robin_b

(Themenstarter)

Anmeldungsdatum:
17. April 2020

Beiträge: 11

Danke, das ist auf jeden Fall hilfreich.

Das Problem ist jetzt allerdings noch, dass ich statt den wirklichen Kundennamen für jeden Datensatz "kunde" ausgegeben bekomme. Ich habe schon versucht in der mqsql-Abfrage die ' ' bei SELECT weg zu lassen, dann werden mir die richtigen Kundennummern angezeigt.

Leider habe ich in meiner Datenbank aber auch Felder welche einen Bindestrich im Namen haben (z.B "beispiel-feld"). Wenn ich dann aber die SELECT-Anfrage ohne ' ' mache, bekomme ich folgende Fehlermeldung:

1
ERROR 1054 (42S22) at line 1: Unknown column 'beispiel' in 'field list'

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Du kannst die Felder in Backticks packen:

1
mysql --host=XXX --database XXX-u XXX -e 'SELECT `beispiel-feld` FROM XXX' -p

robin_b

(Themenstarter)

Anmeldungsdatum:
17. April 2020

Beiträge: 11

seahawk1986 schrieb:

Du kannst die Felder in Backticks packen:

1
mysql --host=XXX --database XXX-u XXX -e 'SELECT `beispiel-feld` FROM XXX' -p

Das dachte ich auch, allerdings bekomme ich dann folgende Fehlermeldung:

1
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM XXX WHERE kunde='XXX'' at line 1

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

robin_b schrieb:

1
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM XXX WHERE kunde='XXX'' at line 1

Hast du da die einfachen Anführungszeichen sowohl um den String als auch um das Statement herum genutzt? Da musst du alternieren, damit das Statement nicht vorzeitig beendet wird, z.B.:

1
mysql --host=XXX --database XXX-u XXX -e 'SELECT `beispiel-feld` FROM XXX where kunde="XXX"' -p

robin_b

(Themenstarter)

Anmeldungsdatum:
17. April 2020

Beiträge: 11

Ne ich hatte doppelte Anführungszeichen, mit einfachen klappt es tatsächlich.

Daraus ergibt sich allerdings ein neues Problem. Ich will für die Abfrage des Kunden eine Variable verwenden. Mit den einfachen Anführungszeichen um die gesamte Abfrage funktioniert dies allerdings nicht. Ich bekomme so immer eine leere Ausgabe.

So sieht meine Abfrage aus:

1
mysql -sN --host=XXX --database XXX -u XXX -e 'SELECT `beispiel-feld` FROM XXX WHERE kunde="$variable"' -p

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Die Shell ist beim Escaping recht umständlich, da muss man dann anfangen zu tricksen - z.B.:

1
mysql -sN --host=XXX --database XXX -u XXX -e 'SELECT `beispiel-feld` FROM XXX WHERE kunde="'"$variable"'"' -p

Eventuell wäre eine Lösung mit einer anderen Skriptsprache wie Python praktischer, da kann man das Einsetzen von Variablen in SQL-Statements sicherer (automatisches Escaping) und bequemer gestalten: https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

robin_b

(Themenstarter)

Anmeldungsdatum:
17. April 2020

Beiträge: 11

Diese Lösung reicht für den Anfang erstmal. Werde mir dann wenn ich mal Zeit habe Python genauer anschauen.

Vielen Dank für deine Hilfe! ☺

Antworten |