Perl-Tänzer: passing Datenbank Informationen zur Vorlage
Frage
Nach Dancer Tutorial hier:
http://search.cpan.org/dist/Dancer/ lib / Dancer / Tutorial.pod
Ich bin meine eigene sqlite3 Datenbank mit diesem Schema mit
CREATE TABLE if not exists location (location_code TEXT PRIMARY KEY, name TEXT, stations INTEGER);
CREATE TABLE if not exists session (id INTEGER PRIMARY KEY, date TEXT, sessions INTEGER, location_code TEXT, FOREIGN KEY(location_code) REFERENCES location(location_code));
Meine Tänzer Code (helloWorld.pm) für die Datenbank:
package helloWorld;
use Dancer;
use DBI;
use File::Spec;
use File::Slurp;
use Template;
our $VERSION = '0.1';
set 'template' => 'template_toolkit';
set 'logger' => 'console';
my $base_dir = qq(/home/automation/scripts/Area51/perl/dancer);
# database crap
sub connect_db {
my $db = qw(/home/automation/scripts/Area51/perl/dancer/sessions.sqlite);
my $dbh = DBI->connect("dbi:SQLite:dbname=$db", "", "",
{ RaiseError => 1, AutoCommit => 1 });
return $dbh;
}
sub init_db {
my $db = connect_db();
my $file = qq($base_dir/schema.sql);
my $schema = read_file($file);
$db->do($schema) or die $db->errstr;
}
get '/' => sub {
my $branch_code = qq(BPT);
my $dbh = connect_db();
my $sql = q(SELECT * FROM session);
my $sth = $dbh->prepare($sql) or die $dbh->errstr;
$sth->execute or die $dbh->errstr;
my $key_field = q(id);
template 'show_entries.tt', {
'branch' => $branch_code,
'data' => $sth->fetchall_hashref($key_field),
};
};
init_db();
true;
Versuchte das Beispiel Vorlage auf der Website, funktioniert nicht.
<% FOREACH id IN data.keys.nsort %>
<li>Date is: <% data.$id.sessions %> </li>
<% END %>
Erzeugt Seite, aber ohne Daten. Wie behebe ich das, da keine Anhaltspunkte kommen in der Konsole / cli?
* UPDATE * Wenn ich den Datenbank-Code, um diese Änderung:
get '/' => sub {
my $branch_code = qq(BPT);
my $dbh = connect_db();
my $sql = 'SELECT * FROM session';
#my $sth = $dbh->prepare($sql) or die $dbh->errstr;
#$sth->execute or die $dbh->errstr;
#my $key_field = q(id);
my $entries = $dbh->selectall_arrayref($sql,{});
template 'show_entries.tt', {
'branch' => $branch_code,
#'data' => $sth->fetchall_hashref('id'),
'data' => @$entries,
};
};
Ich bekomme ein Ergebnis aus der Tabelle in der Vorlage. So die Info wird vergangen, aber die Syntax für die Vorlage funktioniert nicht wie beschrieben. Das paßt mit Template Toolkit-Syntax.
Danke
Bubnoff
EDIT / RESOLUTION **
David erinnerte mich an Data :: Dumper, das bestätigt, dass das Problem war in der Tat mit der Template-Konfiguration. Ich kommentierte die Vorlage-Direktive in der Konfigurationsdatei denkt, dass es überflüssig wäre, da es in dem Code selbst war. FALSCH!!! Es muss in der YAML konfiguriert werden. Löschen ein Rautenzeichen in dem Config-Set aller Rechte. Jetzt bin ich verlegen fast nicht Data :: Dumper in erster Linie versuchen. Dank David!
Lösung
Zunächst einmal sicherstellen, dass Sie vorbei, was Sie denken, Sie vorbei sind an der Vorlage.
Weisen Sie das Ergebnis von $ sth-> fetchall_hashref ($ key_field) in einen temporären Skalar, dann werfen Sie es mit Data :: Dump oder Data :: Dumper (oder finden Sie unter Dancer :: Plugin :: DebugDump für einen Weg, es tot leicht) zu machen.