webentwicklung-frage-antwort-db.com.de

Speichern Sie die Mysql-Abfrage in einer Shell-Variablen

Ich brauche eine Variable, um Ergebnisse aus der Datenbank abzurufen. Bisher versuche ich das im Grunde ohne Erfolg.

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a)

Mein Verständnis von Bash-Befehlen ist nicht sehr gut, wie Sie sehen können.

34
imnotneo

Ich weiß nicht viel über die MySQL-Befehlszeilenschnittstelle, aber vorausgesetzt, Sie brauchen nur Hilfe beim Bashing, sollten Sie versuchen, die Befehle wie folgt auszutauschen:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password)

welche die Zeichenfolge in MySQL echos. Oder Sie können etwas ausgefallener sein und einige neue bash-Features (den Here-String) verwenden.

myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a")

das Ergebnis ist dasselbe (vorausgesetzt, Sie verwenden eine aktuelle genug bash-Version), ohne ein Echo zu erfordern.

Beachten Sie, dass das -p $ -Kennwort kein Tippfehler ist. MySQL erwartet jedoch, dass Kennwörter über die Befehlszeile eingegeben werden (ohne Leerzeichen zwischen Option und Wert).

Beachten Sie, dass myvariable alles enthält, was MySQL standardmäßig ausgibt (normalerweise alles außer Fehlermeldungen), einschließlich aller Spaltenüberschriften, ASCII-Art-Frames usw., die möglicherweise nicht Ihren Vorstellungen entsprechen.

BEARBEITEN:
Wie bereits erwähnt, scheint MySQL einen -e-Parameter zu haben. Ich würde diesen definitiv wählen.

42
falstro

Ein direkterer Weg wäre:

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a")
53
ennuikiller

Um die Daten Zeile für Zeile in ein Bash-Array zu lesen, können Sie Folgendes tun:

while read -a row
do
    echo "..${row[0]}..${row[1]}..${row[2]}.."
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)

Oder in einzelne Variablen:

while read a b c
do
    echo "..${a}..${b}..${c}.."
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)
15

Sie haben die Pipe andersherum und müssen die Abfrage wie folgt wiederholen:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password)

Eine andere Alternative besteht darin, nur den mysql-Client zu verwenden

myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a")

(-s ist erforderlich, um die ASCII-Kunst zu vermeiden)

Nun ist BASH nicht die am besten geeignete Sprache, um mit dieser Art von Szenarien umzugehen, insbesondere mit Strings und dem Teilen von SQL-Ergebnissen und dergleichen. Sie müssen viel arbeiten, um Dinge zu erhalten, die in Perl, Python oder PHP sehr, sehr einfach sind.

Wie bekommen Sie zum Beispiel A, B und C für ihre eigene Variable? Es ist sicherlich machbar, aber wenn Sie Pfeifen und Echo (sehr einfaches Shell-Material) nicht verstehen, wird es für Sie nicht leicht sein, wenn Sie also eine besser geeignete Sprache verwenden.

12
Vinko Vrsalovic

Wenn Sie einen einzelnen Wert in Bash verwenden möchten, verwenden Sie Folgendes:

  companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1)

  echo "$companyid"
7
Isidoros
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a)

ohne das Leerzeichen nach -p. Es ist trivial, aber ohne Arbeit. 

3
puchrojo

Wenn Sie einen bestimmten Datenbanknamen und einen Host haben, auf dem die Abfrage ausgeführt werden soll, folgen Sie der folgenden Abfrage:

outputofquery=$(mysql -u"$dbusername" -p"$dbpassword" -h"$dbhostname" -e "SELECT A, B, C FROM table_a;" $dbname)

Um die Mysql-Abfragen ausführen zu können, müssen Sie den Mysql-Client unter Linux installieren

1
Tamgale Prasad

Ein anderes Beispiel, wenn der Tabellenname oder die Datenbank nicht unterstützte Zeichen enthält, z. B. ein Leerzeichen oder '-'.

db='data-base'

db_d=''
db_d+='`'
db_d+=$db
db_d+='`'

myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"`
0
Sanya Snex
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT
    use databaseName;
    SELECT fieldName FROM tablename WHERE filedName='fieldValue';
QUERY_INPUT
)
echo "myvariable=$myvariable"
0
Dima