perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 21
Click for quality!




12.02.2012 / 02:17

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragAuslesen 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

BeitragWelche 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

Beitragre: 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

Beitragre: 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

BeitragNur 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

Beitragre: 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

-






-
-