Auslesen von Files und ausführen darin enthaltenen SQL Befehlen
|
Seitenanfang |
| Schönen guten Tag, Ich bin ein absoluter PERL Anfänger. Allgemein bin ich was Scripting und Programmieren anbelangt eine Laie. Dennoch möchte ich ein Script erstellen welches mir zur Zeit alles abverlangt. Ich muss auf einem Linuxrechner Files aus einem bestimmten verzeichnis auslesen und die darin enthaltenen SQL Befehle sollen ausgeführt werden (POSTGRES DB). Nach einer ERFOLGREICHEN Durchführung sollen diese Files dann aus dem Verzeichnis gelöscht werden (idealerweise in ein eigenes Backup Verzeichnis). Für jegliche Hilfe wäre ich sehr dankbar. MfG Kuse
Datum: 03.12.2009-10:09

|
re: Auslesen von Files und ausführen darin enthaltenen SQL Befehlen
|
Seitenanfang |
| Hallo, wie sind die SQL-Befehle voneinander getrennt? Ist eine Leerzeile dazwischen ist pro SQL-Befehl eine Zeile gedacht? Mal als Gedankenanstoß #!/usr/bin/perl # Pragmas fuer besseren Code use strict; use warnings; # Modul für DB-Anbindung use DBI; # Modul zum bequemen Auslesen des Verzeichnisses use File::Find::Rule; # Verzeichnis mit Dateien my $directory = '/path/to/dir'; # DB-Daten my $user = "ccc"; my $password = "xxx"; my $db = 'dbname'; my $dbh = DBI->connect( "DBI:Pg:$db:localhost",$user,$password) or die $DBI::errstr; # hole Dateien in dem Verzeichnis # file: nur Dateien # maxdepth 1: keine Unterverzeichnisse auslesen # in: in welchem Verzeichnis my @files = File::Find::Rule->file->maxdepth( 1 )->in( $directory ); # lese jede Datei aus und fuehre SQL-Anweisungen aus for my $file ( @files ) { read_and_execute( $file,$dbh ); } sub read_and_execute { my ($sql_file,$dbh) = @_; my $sql_error = 0; # oeffne Datei "lesend" open my $fh, '<', $sql_file or die $!; while( my $line = <$fh> ) { $dbh->do( $line ) or $sql_error = 1; } close $fh; # loesche Datei wenn kein Fehler aufgetreten ist unlink $sql_file unless $sql_error; }
Datum: 03.12.2009-13:40

|
re: Auslesen von Files und ausführen darin enthaltenen SQL Befehlen
|
Seitenanfang |
| Vielen, vielen Dank, werd ich sogleich ausprobieren und anpassen. mfg Kuse
Datum: 03.12.2009-13:45

|
re: Auslesen von Files und ausführen darin enthaltenen SQL Befehlen
|
Seitenanfang |
Die SQL Befehle sind so gedacht, dass pro Zeile ein SQL Befehl abgesetzt wird, wobei dieser manchmal 1 1/2 Zeilen lang werden kann. Danach wird ein weiterer Befehl in einer neuen Zeile angefangen.Vielen Dank LG Kuse
Datum: 03.12.2009-13:53

|
Welche module werden benötigt?
|
Seitenanfang |
| Mahlzeit, Nachdem ich das Script angepasst habe bekomme ich beim Starten Fehler, dass einige Module noch nicht installiert sind und zwar im Bezug auf folgende Zeilen: # Modul zum bequemen Auslesen des Verzeichnisses use File::Find::Rule; UND my $dbh = DBI->connect( "DBI:Pg:$db:localhost",$user,$password) or die $DBI::errstr; Welche Module müssen hierfür noch installiert werden? Vielen dank für die Hilfe MfG Kuse
Datum: 07.12.2009-13:25

|
re: Welche module werden benötigt?
|
Seitenanfang |
| Du brauchst DBI DBD::Pg File::Find::Rule Hier findest Du eine ausführliche Anleitung, wie man Module installiert: http://wiki.perl-community.de/Wissensbasis/ModuleWieInstalliereIchEinModul
Datum: 07.12.2009-19:42

|
re: Auslesen von Files und ausführen darin enthaltenen SQL Befehlen
|
Seitenanfang |
| Mahlzeit, Das Script funktioniert jetzt ausgezeichnet, Module wurden problemlos nach installiert. Eine Frage hätte ich noch, ich würde gerne nachdem die SQL Statements erfoglreich ausgeführt wurden diese in ein Backupverzeichnis kopieren und eben erst danach die Files in dem Zielverzeichnis löschen. Das Löschen funktioniert ja bereits, nur hab ich eben noch kein copy der files in einen Backup Ordner. Vielen herzlichen Dank MfG Kuse
Datum: 09.12.2009-13:05

|
Nur noch ein Backup
|
Seitenanfang |
| Mahlzeit, Das Script funktioniert jetzt ausgezeichnet, Module wurden problemlos nach installiert. Eine Frage hätte ich noch, ich würde gerne nachdem die SQL Statements erfoglreich ausgeführt wurden diese in ein Backupverzeichnis kopieren und eben erst danach die Files in dem Zielverzeichnis löschen. Das Löschen funktioniert ja bereits, nur hab ich eben noch kein copy der files in einen Backup Ordner. Vielen herzlichen Dank MfG Kuse
Datum: 09.12.2009-13:07

|
re: Nur noch ein Backup
|
Seitenanfang |
| Dafür würde ich das Modul File::Copy verwenden. Das Modul brauchst Du nicht installieren, weil es zum Perl-Kern gehört. Dann würde ich auch das "unlink" rausnehmen und durch ein "move" aus File::Copy ersetzen. Hier kurz die Verwendung gezeigt: use File::Copy qw(move); # .... hier der weitere Code # ... in der Schleife (anstatt des unlink-Befehls) move( $sql_file, $target ) unless $sql_error; $target musst Du halt entsprechend setzen, dass die Datei im Backup-Verzeichnis landet.
Datum: 09.12.2009-13:46

|