Ich wollte mich ein wenig mit Class::DBI beschäftigen. Dazu habe ich mir eine kleine Datenbank 'cdbi' angelegt:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#
# Tabellenstruktur für Tabelle `abteilung`
#
DROP TABLE IF EXISTS `abteilung`;
CREATE TABLE `abteilung` (
`AID` bigint(20) unsigned NOT NULL auto_increment,
`Abteilung` varchar(20) NOT NULL default '',
PRIMARY KEY (`AID`)
) TYPE=MyISAM AUTO_INCREMENT=4;
#
# Daten für Tabelle `abteilung`
#
INSERT INTO `abteilung` VALUES (1, 'Entwicklung');
INSERT INTO `abteilung` VALUES (2, 'EDV');
INSERT INTO `abteilung` VALUES (3, 'Buchhaltung');
# --------------------------------------------------------
#
# Tabellenstruktur für Tabelle `mitarbeiter`
#
DROP TABLE IF EXISTS `mitarbeiter`;
CREATE TABLE `mitarbeiter` (
`MID` bigint(20) unsigned NOT NULL auto_increment,
`Vorname` varchar(20) NOT NULL default '',
`Nachname` varchar(20) NOT NULL default '',
`SID` bigint(20) unsigned NOT NULL default '0',
`AID` bigint(20) unsigned NOT NULL default '0',
PRIMARY KEY (`MID`)
) TYPE=MyISAM AUTO_INCREMENT=3;
#
# Daten für Tabelle `mitarbeiter`
#
INSERT INTO `mitarbeiter` VALUES (1, 'Joe', 'Mustermann', 1, 1);
INSERT INTO `mitarbeiter` VALUES (2, 'Ray', 'Jones', 3, 2);
# --------------------------------------------------------
#
# Tabellenstruktur für Tabelle `standort`
#
DROP TABLE IF EXISTS `standort`;
CREATE TABLE `standort` (
`SID` bigint(20) unsigned NOT NULL auto_increment,
`Standortbezeichnung` varchar(30) NOT NULL default '',
PRIMARY KEY (`SID`)
) TYPE=MyISAM AUTO_INCREMENT=4;
#
# Daten für Tabelle `standort`
#
INSERT INTO `standort` VALUES (1, 'Berlin');
INSERT INTO `standort` VALUES (2, 'Darmstadt');
INSERT INTO `standort` VALUES (3, 'Frankfurt');
Dann das folgende kleine Perl-Skript geschrieben:
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
#!/usr/bin/perl
use strict;
use warnings;
package Staff::DBI;
use base 'Class::DBI';
Staff::DBI->connection('DBI:mysql:host="localhost";database="cdbi"', 'webdev', 'secret');
1;
package Staff::mitarbeiter;
use base 'Staff::DBI';
Staff::mitarbeiter->table('mitarbeiter');
Staff::mitarbeiter->columns(All => qw/MID Vorname Nachname SID AID/);
1;
package Staff::abteilung;
use base 'Staff::DBI';
Staff::abteilung->table('abteilung');
Staff::abteilung->columns(All => qw/AID Abteilung/);
Staff::abteilung->has_many(mitarbeiter => 'Staff::mitarbeiter');
1;
package Staff::standort;
use base 'Staff::DBI';
Staff::standort->table('standort');
Staff::standort->columns(All => qw/SID Standortbezeichnung/);
Staff::standort->has_many(mitarbeiter => 'Staff::mitarbeiter');
1;
# Class::DBI end here - main() is beyond this point
package main;
use Data::Dumper;
my @staff = Staff::mitarbeiter->retrieve_all;
print Dumper \@staff;
exit;
Leider erzeugt es nur folgende Fehlermeldung:
Can't locate object method "connection" via package "Staff::DBI" at (...) line 8
Ich habe mich an dem Beispiel auf der CPAN-Seite zu Class::DBI orientiert - kann aber keinen Unterschied feststellen, wieso das dortige Beispiel läuft?!
Gruss,
Ronnie