2010-10-10 9 views
15

Ich habe eine Shell (bash) Skript versucht, eine Zeile in einer Remote-Datenbank einfügen zu bekommen, aber ich habe einige Probleme wurden mit :(Shell-Skript Mit den Daten in Remote-MySQL-Datenbank einfügen

Die Skript ist dazu gedacht, eine Datei auf einen Server hochzuladen, eine URL, HASH und eine Dateigröße zu erhalten, eine Verbindung zu einer entfernten MySQL-Datenbank herzustellen und die Daten in eine existierende Tabelle einzufügen, bis das entfernte MYSQL-Datenbankbit funktioniert.

Es sieht wie folgt aus:

#!/bin/bash 

zxw=randomtext 
description=randomtext2 

for file in "[email protected]" 
do 
echo -n ***** 
ident= ***** 
data= **** 
size=` **** 
hash=`**** 
mysql --host=randomhost --user=randomuser --password=randompass randomdb 
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size'); 
echo "done" 
done 

ich insgesamt Noob bei der Programmierung bin Also yeh: P

Wie auch immer, ich habe die \ hinzugefügt, um die Klammern zu entkommen, als ich Fehler bekam. Wie es jetzt ist, funktioniert das Skript gut bis zur Verbindung mit der MySQL-Datenbank. Es verbindet sich nur mit der mysql-Datenbank und führt den Befehl insert nicht aus (und ich weiß nicht einmal, ob der insert-Befehl in bash funktionieren würde).

PS: Ich habe beide mysql-Befehle von der Befehlszeile nacheinander ausprobiert, und sie funktionierten, obwohl ich die Hash/Datei/Größe definiert und nicht die escaping "\".

Wie auch immer, was denkst du? Was versuche ich noch zu erreichen? Wenn das so ist, wie?

Jede Hilfe wäre :)

Antwort

29

Die INSERT-Anweisung muss an mysql gesendet werden, nicht an eine weitere Zeile im Shell-Skript. Sie müssen also ein "HIER-Dokument" erstellen.

mysql --host=randomhost --user=randomuser --password=randompass randomdb << EOF 
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size'); 
EOF 

Die << EOF Mittel alles vor der nächsten Zeile übernehmen, die das Programm nichts anderes als EOF (kein Leerzeichen am Anfang) als Standardeingabe enthält.

+0

Erhalte diesen Fehler damit: Zeile 22: Warnung: Here-Dokument in Zeile 19 durch Dateiende (gewünscht 'EOF ') begrenzt Zeile 23: Zeile 23: Syntaxfehler: unerwartetes Ende der Datei – lelouch

+2

@Lelouch - Sie links Aus dem "EOF" in der dritten Zeile oben. Es ist wichtig, die gesamte Lösung umzusetzen, nicht nur die erste Hälfte. –

+0

Hmm, nah, ich fügte klar die << EOF in der mysql-Zeile, und eine andere EOF in einer neuen Zeile nach der Einfügung. Irgendeine Idee auf was ist falsch? – lelouch

5

nicht roh SQL von bash geschätzt werden Verwenden; bash hat keine vernünftige Möglichkeit, die Daten vorher zu bereinigen. Generieren Sie eine CSV-Datei und laden Sie diese stattdessen hoch.

+0

Es soll vollständig automatisiert werden mit vielen Dateien durch diesen Prozess. Wenn ich eine CSV-Datei oder etwas anderes verwende, führt das nicht dazu, dass die gleichen Daten doppelt eingegeben werden? -> Entschuldige meine mögliche Ignoranz! – lelouch

+0

Wenn Sie ein Feld oder eine bestimmte Gruppe von Feldern benötigen, die innerhalb der Tabelle eindeutig sein sollen, sollten Sie einen eindeutigen Index erstellen. –

+1

Ich möchte hinzufügen, dass eine andere Antwort auf Stapel sagte, keine CSV-Datei zu verwenden.Wenn Sie mit einer entfernten MySQL-Datenbank verbunden sind, ist es schwierig, den csv lokal zu generieren. Sie müssen herausfinden, wie Sie die csv remote generieren und dann in das lokale Verzeichnis übertragen können. Die andere Antwort empfohlen Piping. Also was ist es? Verwenden wir CSVs oder nicht ?! – obesechicken13

11

Dies ist möglicherweise nicht genau das, was Sie suchen, aber es ist eine Option.

Wenn Sie den Ärger vermeiden möchten, Ihre Anfrage tatsächlich in das sh-Skript aufzunehmen, können Sie die Abfrage als .sql-Datei speichern (nützlich manchmal, wenn die Abfrage wirklich groß und kompliziert ist). Dies kann mit einer einfachen Datei-IO in der von Ihnen verwendeten Sprache erfolgen.

Dann können Sie einfach in Ihrem sh Scrip so etwas wie die folgenden:

mysql -u youruser -p yourpass -h remoteHost < query.sql & 

Dies wird Batch-Modus Ausführung aufgerufen. Optional können Sie das Und-Zeichen am Ende einfügen, um sicherzustellen, dass diese Zeile des SH-Skripts nicht blockiert wird.

Auch wenn Sie Bedenken haben, dass dieselben Daten mehrmals eingegeben werden und Ihre rdbms inkonsistent werden, sollten Sie MySQL-Transaktionen untersuchen (Commit, Rollback usw.).

+1

Diese Antwort funktioniert bei mir. Wirklich saubere Ausgabe. – obesechicken13