Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3486[/thread]

MySQL: SQL-Abfrage im Hash' dauerhaft speichern?: Dauerhafte Speicherung!



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2004-07-28 18:47
#32445 #32445
Hi alle zusammen,

meine Erfahrungen bezüglich Perl-Programmierung sind noch recht jungfreulich, besonders im Umgang mit DBI bzw. DBD::mysql.
Auch wenn die Frage trivial zu sein scheint, aber wie kann ich die Lösungsmenge meiner SQL-Abfragen "dauerhaft" in einem Array oder Hash speichern. Es gibt einige Beispiele, die zeigen wie man den result-set auf Kommandozeilen-Ebene ausgibt, z. B.:

while (@mein_array = $cursor->fetchrow_array())
{
print "@mein_array\n";
}
# liefert das Ergebnis auf STDOUT aus!

Letztlich will ich aber, nachdem der Durchlauf beendet ist, auf jede einzelne Row weiterhin über einen Hash oder Array zugreifen können, ähnlich wie bei einem Durchlauf durch eine Datei, wobei sämtliche Zeilen in einem Hash abgelegt werden.

Hoffe mal ich habe mich nicht zu umständlich ausgedrückt:)

Schon mal besten Dank an Euch!

Dennis
Ronnie
 2004-07-28 18:55
#32446 #32446
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Beispiel:
Code: (dl )
push @$result, $row while ($row = $sth->fetchrow_hashref());

Du kannst die jeweilige Ergebnissmenge in einem Array ablegen.
format_c
 2004-07-28 21:37
#32447 #32447
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
...
use Storable;
my $hashref = $dbh->selectall_hashref($statement);

Storable::store($hashref,'datei.ser') or die "Konnte datei.ser nicht schreiben: $!";
undef $hashref;
$hashref = Storable::retrieve('datei.ser') or "Konnte datei.ser nicht lesen: $!";

use Data::Dumper;
print Data::Dumper::Dump($hashref);
# ungetestet


Mit CPAN:Storable kannst du komplexe Datenstrukture bequem serialisieren und speichern.

Gruß Alex\n\n

<!--EDIT|format_c|1091036406-->
Ronnie
 2004-07-28 21:43
#32448 #32448
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@format_c: Hmm, wenn es um Persistenz geht ist deine Antwort richtig. Aber das erscheint unplausibel weil die Daten ja schon in einer Datenbank gespeichert sind. Ich hatte es so verstanden das es darum ging die abgefragten Daten außerhalb der while-Schleife zur Verfügung zu haben.

Gruß,
Ronnie
format_c
 2004-07-28 21:48
#32449 #32449
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wer weis... Es gibt die dollsten Ideen. Ich denke mal so etwas kommt darauf an, wie komlex die Datenstruktur und die Abfrage ist. Wenn dann noch die herausgefilterte Menge an Daten relativ gering ist macht so etwas als Art 'Cache' schon Sinn.
Aber die genauen Intensionen hab ich, genau wie du, nicht erkennen können. Das wird wohl nur Dennis wissen. Wir werden sehen.

Gruß Alex
Dennis
 2004-07-29 10:36
#32450 #32450
User since
2004-07-28
9 Artikel
BenutzerIn
[default_avatar]
Moin, Ihr!

Werde das nachher ausprobieren! Besten Dank auch!
Falls es Schwierigkeiten in irgendeiner gearteten Form geben
sollte, werde ich nochmal posten.

Beste Grüße
Dennis
Strat
 2004-07-29 12:42
#32451 #32451
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[edit]Diese Nachricht ist Schrott; siehe weiter unten[/edit]

nebenbei:
Code: (dl )
while (my @array = $sth->fetchrow()) {

bricht bei einer Zeile, die nur als NULLen besteht, die schleife ab und liest nicht mehr weiter; deshalb verwende ich da lieber
Code: (dl )
1
2
while (my $arrayRef = $sth->fetchrow_arrayref()) {
 my @array = @$arrayRef; # oder besser direkt mit $arrayRef arbeiten

oder
Code: (dl )
1
2
while (my $hashRef = $sth->fetchrow_hashref()) {
 my %hash = %$hashRef; # oder besser direkt mit $hashRef arbeiten

es gibt zwar auch die moeglichkeit, aussen herum noch eine Schleife zu legen, in der nachgeschaut wird, wie viele ergebnisse noch zum lesen bereit sind, aber das ist meines Wissens nach nicht DB-uebergreifend loesbar (bei sybase heisst es, wenn ich mich recht erinnere, z.B.:
Code: (dl )
1
2
while ($sth->{syb_more_results}) {
 while (my @array = $sth->fetchrow) {

aber eben leider nur bei Sybase...\n\n

<!--EDIT|Strat|1091122399-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2004-07-29 13:12
#32452 #32452
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Strat,29.07.2004, 10:42]nebenbei:
Code: (dl )
while (my @array = $sth->fetchrow()) {

bricht bei einer Zeile, die nur als NULLen besteht, die schleife ab und liest nicht mehr weiter;
[/quote]
sorry, dass ich jetzt zu faul bin, das auszuprobieren, aber das glaube ich
nicht. denn ein @array voller NULLen ist ja in perl ein @array voller
undefs, und das ist 'wahr', denn es wird die länge des arrays abgefragt. und
die länge von @array = (undef, undef, undef) ist 3.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
format_c
 2004-07-29 18:32
#32453 #32453
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@pq: Das hab ich mir auch überlegt und bin auch deiner meinung
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table nulltest (leeresfeld int(1) default null);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into nulltest values (null);
Query OK, 1 row affected (0.01 sec)

mysql> select * from nulltest;
+------------+
| leeresfeld |
+------------+
| NULL |
+------------+
1 row in set (0.02 sec)

mysql>\q
Bye
format_c@server:~> cd perl_scripts/
format_c@server:~/perl_scripts> vi test.pl
format_c@server:~/perl_scripts> cat test.pl && perl test.pl
use strict;
use DBI;
my $dbh = DBI->connect('DBI:mysql:database=test;host=localhost;','test','test')
or die DBI::errstr();
my $sth = $dbh->prepare('SELECT * FROM nulltest') or die $dbh->errstr();
$sth->execute() or die $dbh->errstr();

my $i = 0;
while (my @row = $sth->fetchrow_array()) {
print ++$i,"\n";
}
$sth->finish();
$dbh->disconnect();

exit;

1
format_c@server:~/perl_scripts>


So das Beispiel widerlegt IMHO Strat's Aussage.

Gruß Alex
Strat
 2004-07-29 21:32
#32454 #32454
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=pq,29.07.2004, 11:12]sorry, dass ich jetzt zu faul bin, das auszuprobieren, aber das glaube ich
nicht. denn ein @array voller NULLen ist ja in perl ein @array voller
undefs, und das ist 'wahr', denn es wird die länge des arrays abgefragt. und
die länge von @array = (undef, undef, undef) ist 3.[/quote]
sorry fuer den fehler, war verwechslung

nur bei folgendem tritt dieses problem auf (wegen listenkontext), nicht aber bei dem von mir oben angegebenen beispiel:
Code: (dl )
1
2
while (my ($x, $y) = $sth->fetchrow()) {
...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-07-28 18:47.