ubuntuusers.de

SQL Abfrage per Shell

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

amalthea

Avatar von amalthea

Anmeldungsdatum:
27. März 2010

Beiträge: 132

Hallo ich habe eine Frage. (bin mir nicht sicher ob das hier rein gehört oder in Serverdienste.... ggf. bitte vom Moderator verschieben) Mein Ziel ist es eine SQL Datenbank aus einem Shellscript heraus abzufragen und abhängig vom Ergebnis eine Aktion auszuführen. Ein Shell Script ist kein Problem. Auch eine SQL Abfrage bekomme ich mit Select hin. Aber wie packe ich das in ein Shell script so das ich mit dem Ergebnis arbeiten kann. Erstes googlen zeigte mir, das dafür Python oder Perl bessere Lösungen bereit hält. Was denkt das Forum? Perl? Wenn ja, wie ungefähr sähe so ein Grundgerüst aus?

Vibaf

Ehemaliger

Anmeldungsdatum:
27. Dezember 2007

Beiträge: 3046

Wenn du Perl oder Python kannst, kannst du es ja damit machen. Wenn die bash jetzt dein erstes Mittel der Wahl ist geht das auch:

1
echo "select * from table" | mysql -u username -p datenbank

Mit -u gibst du den Usernamen an, mit -p, dass er ein Passwort hat und zum Schluss die Datenbank. Wenn du das Passwort nicht manuell eingeben willst, kannst du es auch direkt hinter das p schreiben, z.B. wenn das Passwort "pw" ist

1
mysql -u username -ppw datenbank

In so einem Fall sollter der Nutzer allerdings keine Schreibrechte haben, da im Falle eines Scripts das Passwort ja dann unverschlüsselt auf der Festplatte liegt.

amalthea

(Themenstarter)
Avatar von amalthea

Anmeldungsdatum:
27. März 2010

Beiträge: 132

kann ich das ergebnis von dem ersten beispiel in eine variable schreiben lassen?

so das ich damit arbeiten kann?

amalthea

(Themenstarter)
Avatar von amalthea

Anmeldungsdatum:
27. März 2010

Beiträge: 132

würde das so gehen?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#! /usr/bin/perl -w
$dbconfig{'default'}  =   {'user'           => 'user',
                           'password'       => 'password',
                           'host'           => 'localhost',
                           'port'           => '111',
                           'charset'        => 'latin1',
                           'database'       => 'database',
                           'l_insert_id'    => 'LAST_INSERT_ID()',
                           'sep'            => '`'};
$mailprog="/usr/sbin/sendmail";
($ergebnis) = &dbquery('SELECT sendungsnummer FROM Bestellungen where sendungsnummer =! 0');

Vibaf

Ehemaliger

Anmeldungsdatum:
27. Dezember 2007

Beiträge: 3046

amalthea schrieb:

kann ich das ergebnis von dem ersten beispiel in eine variable schreiben lassen?

Ja.

1
myVar="$(echo "SELECT * FROM table" | mysql -u user -p datenbank)"

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13192

amalthea schrieb:

(bin mir nicht sicher ob das hier rein gehört oder in Serverdienste.... ggf. bitte vom Moderator verschieben)

Passt schon.

Mein Ziel ist es eine SQL Datenbank aus einem Shellscript heraus abzufragen und abhängig vom Ergebnis eine Aktion auszuführen. Ein Shell Script ist kein Problem. Auch eine SQL Abfrage bekomme ich mit Select hin. Aber wie packe ich das in ein Shell script so das ich mit dem Ergebnis arbeiten kann.

Dafür müssten wir wissen, um welche Datenbank es sich handelt. Ist es Postgres, MySQL, MariaDB, Oracle...?

Erstes googlen zeigte mir, das dafür Python oder Perl bessere Lösungen bereit hält. Was denkt das Forum?

Das hängt davon ab: wenn Du sehr viel mit der Datenbank interagieren musst, lohnt sich der Aufwand in eine Sprache einzuarbeiten und die entsprechende Funktionalität zu installieren. Wenn das dann erst mal läuft, werden komplette Anwendungen, die immer wieder mit der Datenbank sprechen müssen einfacher und meist auch schneller (weil man nicht immer neue Prozesse für die Kommunikation starten und DB-Verbindungen aufbauen muss).

Wenn es eher um eine kleine Geschichte oder einmalige Sache handelt, würde ich ein Shell-Skript schreiben, das den Kommandozeilen-Client Deiner Datenbank nutzt.

Perl? Wenn ja, wie ungefähr sähe so ein Grundgerüst aus?

Ich persönlich würde versuchen Perl zu vermeiden, weil Perl zwar mit dem CPAN ein reichhaltiges Angebot an gut dokumentierten Modulen für alles Mögliche hat aber auf der anderen Seite der Code leicht schwer lesbar wird und die Unterstützung für Objektorientierung schlecht ist. Python und Ruby sind da deutlich besser.

Ciao

robert

amalthea

(Themenstarter)
Avatar von amalthea

Anmeldungsdatum:
27. März 2010

Beiträge: 132

Hallo erstmal Danke für die ersten Ideen. Als Datenbank liegt eine mysql dahinter. Ich brauche nur 1 Abfrage, die mir eine Variable liefert. Diese muss ich auswerten und dann ncoh eine Query die was in die Datenbank schreibt. Ein Shell Script währe meine erste Wahl, weil es mehr eine einmalige Sache ist und wenn es läuft keine weitere Beachtung mehr bekommt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13192

amalthea schrieb:

Hallo erstmal Danke für die ersten Ideen. Als Datenbank liegt eine mysql dahinter. Ich brauche nur 1 Abfrage, die mir eine Variable liefert.

Ja, dann kannst Du so etwas tun:

1
value=$(mysql --database=xxx --geignete --optionen --execute='select ...')

siehe http://dev.mysql.com/doc/refman/5.7/en/mysql-command-options.html

Du musst die Optionen natürlich so auswählen, dass nur der Wert ausgegeben wird und nicht etwa die Spaltennamen oder anderes.

Diese muss ich auswerten und dann ncoh eine Query die was in die Datenbank schreibt.

Ähnlich wie oben. Das Kommando würde man ggf. mit doppelten Anführungsstrichen quoten, damit man aus der Shell einen Wert übergeben kann.

1
mysql --database=xxx --quiet --geignete --optionen --execute="update ... set foo='$val'"

Ein Shell Script währe meine erste Wahl, weil es mehr eine einmalige Sache ist und wenn es läuft keine weitere Beachtung mehr bekommt.

👍

Ciao

robert

amalthea

(Themenstarter)
Avatar von amalthea

Anmeldungsdatum:
27. März 2010

Beiträge: 132

brauche nochmal hilfe

script sieht jetzt so aus:

1
2
3
4
#!/bin/bash
myVar=$(echo "SELECT sendungsnummer FROM bestellungen where id=40170" | mysql -u xxx -pxxx -P 111 datenbank)
echo "Variable:"
echo "$myVar"

Die Ausgabe ist: Variable: sendungsnummer 8

Das heisst für mich, er Verbindet zur Datenbank und holt den richtigen Wert, aber dann ist der Inhalt nicht nur die 8 die ich brauch sondern noch sendungsnummer. wie kann cih das unterdrücken?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

amalthea schrieb:

nicht nur die 8 die ich brauch sondern noch sendungsnummer. wie kann cih das unterdrücken?

Am besten natürlich, indem Du die DB-Abfrage anpasst. Sonst, notfalls mit grep -o herausfiltern ? :

myVar=$(echo "SELECT sendungsnummer FROM bestellungen where id=40170" | mysql -u xxx -pxxx -P 111 datenbank   |  grep -o '[0-9]*' )

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13192

amalthea schrieb:

script sieht jetzt so aus:

1
2
3
4
#!/bin/bash
myVar=$(echo "SELECT sendungsnummer FROM bestellungen where id=40170" | mysql -u xxx -pxxx -P 111 datenbank)
echo "Variable:"
echo "$myVar"

Warum nutzt Du nicht die Option "--execute" wie vorgeschlagen? Die Pipe ist doch völlig überflüssig.

Das heisst für mich, er Verbindet zur Datenbank und holt den richtigen Wert, aber dann ist der Inhalt nicht nur die 8 die ich brauch sondern noch sendungsnummer. wie kann cih das unterdrücken?

Bitte schau mal auf den Link, den ich vorher gepostet habe:

Du musst die Optionen natürlich so auswählen, dass nur der Wert ausgegeben wird und nicht etwa die Spaltennamen oder anderes.

Ich habe irgendwie das Gefühl, dass Du ignorierst, was Dir hier vorgeschlagen wird...

Ciao

robert

Antworten |