Schrift
[thread]11511[/thread]

SQL Statement aus Text Datei lesen



<< >> 4 Einträge, 1 Seite
tophoven
 2008-03-22 21:01
#107378 #107378
User since
2005-12-02
28 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe eine Textdatei mit einem SQL Scipt. Jetzt möchte ich diese File in einer bestehende Datenbank ausführen. Hat einer von Euch eine Idee wie ich dies mittles des Package DBD::mysql realisieren kann?

Besten Dank im Voraus

Gruß

Franz-Josef
renee
 2008-03-23 00:43
#107386 #107386
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;
use DBI;

my $file = 'test.sql';
my $dbh = DBI->connect( ... ) or die $DBI::errstr;

open my $fh, '<', $file or die $!;
{
    local $/ = "\n\n";
    while( my $statement = <$fh> ){
        my $sth = $dbh->prepare( $statement ) or die $dbh->errstr;
        $sth->execute or die $dbh->errrstr;
    }
}
close $fh;


test.sql:
Code: (dl )
1
2
3
4
5
6
CREATE TABLE testtbl (
ID int not null primary key,
Testcol VARCHAR(255)
);

INSERT INTO testtbl(ID,Testcol) VALUES(1,'Hallo');
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2008-03-23 00:50
#107387 #107387
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Naja, im Prinzip musst Du lediglich eine Verbindung zur Datenbank herstellen und dann nacheinander alle SQL-Statements abschicken. Das Problem ist nur, dass man eine Datei nicht so einfach statementweise einlesen kann, wenn die Befehle schon mal mehrere Zeilen lang sein können.

Ein einfacher Versuch wäre vielleicht
Code (perl): (dl )
1
2
3
4
5
6
use DBI;

my $dbh = DBI->connect('DBI:mysql:database=foobar', 'nobody', 'secret password');
{ local $/ = ';'; while (my $sql = <>) {
  $dbh->do($sql);
} }


Das verlässt sich aber darauf, dass niemand auf die dumme Idee gekommen ist, in der Datei einen Kommentar mit einem ';' darin zu platzieren ;-) Eigentlich müsste man die Datei richtig parsen...

edit: renees Variante die Befehle durch 2 Zeilenumbrüche zu trennen sieht auch sehr sinnvoll aus!
When C++ is your hammer, every problem looks like your thumb.
Strat
 2008-03-28 12:43
#107589 #107589
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
also wenn nach jedem statement z.B. ; steht, kann man ja das als "zeilentrenner" beim einlesen verwenden, indem du $/ setzt, z.B.:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $FH;
unless( open( $FH, '<', $sqlFile ) ) {
    die "Error: can't open file '$sqlFile': $!\n";
}
else {

    local $/ = ';';
    while( my $statement = <$FH> ) {
        chomp( $statement );

        my $sth = $dbh->prepare( $statement )
            or die "Error in prepare: " . $dbh->errstr;
        $sth->execute()
            or die "Error in excute: " . $dbh->errstr;

    } # while $statement

    close( $FH ) or die "Error at closing file '$sqlFile': $!\n";
}
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 4 Einträge, 1 Seite



View all threads created 2008-03-22 21:01.