Schrift
[thread]11142[/thread]

Update auf db mit perl

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
Duff
 2008-01-15 16:34
#104737 #104737
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe mal eine Frage zum Updaten auf einer DB in perl.

Und zwar lese ich per Skript verschiedene Daten aus einer DB aus und speichere diese bzw. gebe diese dann später wieder aus (select auf DB).
Dass Ganze mache ich per Funktion.

Nun möchte ich mir eine weitere Funktion schreiben, mit der ich ein Update auf die DB ausführen kann. Doch wie muss ich da vorgehen bzw. möchte ich wissen, ob das Update erfolgreich war und wie dann ein rollback oder commit ausführen muss.

Danke & Gruß,
daniel
D'OH
Daniel
renee
 2008-01-15 16:50
#104739 #104739
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
my $stmt = "UPDATE tabellenname SET spalte1 = ?, spalte2 = ? WHERE spalte3 = ?";
my $rows = $dbh->do( $stmt, undef, $spalte1, $spalte2, $spalte3 );

print "$rows Zeilen aktualisiert\n";

$dbh->rollback if $rows;


siehe auch CPAN:DBI
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/
Duff
 2008-01-15 16:51
#104740 #104740
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ok, danke für die schnelle Antwort.
Aber was ist mit einem "commit"?

Oder soll ich AutoCommit => 1 setzen und nicht AutoCommit => 0 verwenden?
D'OH
Daniel
renee
 2008-01-15 16:55
#104741 #104741
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kommt darauf an... Wenn Du Änderungen rückgängig machen willst, dann musst Du AutoCommit auf 0 setzen. Wenn Du alles so in der DB speichern willst, wie es reinkommt und keine Rollbacks machen willst, kannst Du es auf 1 setzen. Da Du explizit nach Rollback gefragt hast, wirst Du AutoCommit auf 0 setzen müssen.
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/
Duff
 2008-01-15 17:05
#104745 #104745
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Jetzt bin ich ein wenig verwirrt.

Also ich möchte, wenn alles korrekt war beim Update, ein commit ausführen.
Andernfalls soll ein rollback gemacht werden.
D'OH
Daniel
renee
 2008-01-15 17:08
#104747 #104747
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn bei dem Update irgendetwas faul ist (was das DBMS entdecken kann, also nicht existente Spalten verwendet wurden oder ähnliches), dann wird der Update ja erst gar nicht ausgeführt. Dann wirst Du in $rows ein undef haben.

Ansonsten definiere mal, was Du als "korrekt" bezeichnest...
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/
Duff
 2008-01-15 17:10
#104748 #104748
User since
2006-10-06
283 Artikel
BenutzerIn

user image
renee+2008-01-15 16:08:22--
Wenn bei dem Update irgendetwas faul ist (was das DBMS entdecken kann, also nicht existente Spalten verwendet wurden oder ähnliches), dann wird der Update ja erst gar nicht ausgeführt. Dann wirst Du in $rows ein undef haben.

Ansonsten definiere mal, was Du als "korrekt" bezeichnest...


ja genauso meine ich das.

sprich ich müsste ein

Code (perl): (dl )
1
2
3
4
5
if($rows) {
   $dbh->commit ;
} else {
   $dbh->rollback;
}
D'OH
Daniel
Duff
 2008-01-16 10:10
#104771 #104771
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Müsste ich aber doch so machen können, oder?
Will es nämlich nicht unbedingt auf einer produktiven DB ausprobieren.
D'OH
Daniel
RalphFFM
 2008-01-16 10:27
#104772 #104772
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo Duff, ich halte es ja nicht für empfehlenswert solche Codeänderungen in ein
produktives System einzubauen ohne diese vorher in einer Testumgebung ausprobiert
zu haben.
renee
 2008-01-16 10:31
#104773 #104773
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn in dem Statement schon ein Fehler ist, wird erst gar nichts in die DB geschrieben, so dass Du auch kein Rollback brauchst.

Ein Rollback (und damit AutoCommit => 0) macht dann Sinn, wenn Du Transaktionen verwenden willst. D.h. wenn Du eine ganze Reihe von Aktionen hast und wenn eine einzige davon schiefläuft, willst Du alles wieder rückgängig machen.

Keinen Sinn macht es bei einem einzigen Statement...

Und vor allem muss es die DB unterstützen...

Hier macht es Sinn:
Code: (dl )
1
2
3
1) Trage was in Tabelle A ein
2) Aktualisiere etwas in Tabelle B in Abhängigkeit zu dem Eintrag in Tabelle A
3) Wenn 2) schiefgelaufen ist, muss 1) rückgängig gemacht werden, damit keine Inkonsistenzen entstehen


Hier macht es keinen Sinn, da das Statement erst gar nicht ausgeführt wird:
Code: (dl )
1) Führe ein fehlerhaftes Statement aus (oder versuche es)


Oder mit etwas Perl-Code
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
# AutoCommit => 0
my $rows_a = $dbh->do( $stmt_1, undef, @binds_1 );
my $rows_b = $dbh->do( $stmt_2, undef, @binds_2 );
unless( defined $rows_a and defined $rows_b ){ # wenn eins von beidem fehlgeschlagen ist
    $dbh->rollback;
}
else{
    $dbh->commit;
}
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/
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2008-01-15 16:34.