perl dancer:将数据库信息传递给模板
以下是舞者教程: 我正在使用我自己的sqlite3数据库和这个模式perl dancer:将数据库信息传递给模板,perl,templates,dancer,Perl,Templates,Dancer,以下是舞者教程: 我正在使用我自己的sqlite3数据库和这个模式 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
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));
数据库的我的舞者代码(helloWorld.pm):
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;
在站点上尝试了示例模板,但无效
<% FOREACH id IN data.keys.nsort %>
<li>Date is: <% data.$id.sessions %> </li>
<% END %>
我从模板中的表中得到一个结果。所以信息正在传递,但是
模板的语法不按所述工作。这与模板工具包的语法是一致的
谢谢
布布诺夫
编辑/解析**
David提醒我Data::Dumper,它确认了问题确实出在模板配置上。我在配置文件中注释掉了template指令,认为它是多余的,因为它在代码中。错!!!它必须在YAML中配置。删除配置中的octothorpe会将所有内容设置为权限。现在我只是为没有首先尝试Data::Dumper而感到尴尬。谢谢你,大卫 首先,确保您正在向模板传递您认为要传递的内容
将$sth->fetchall\u hashref($key\u field)的结果分配给一个临时标量,然后使用Data::dump或Data::Dumper将其转储(或查看使其非常简单的方法)。Data::Dumper显示预期的数据作为哈希传递。正如所料。我认为我的模板配置有问题。也许它试图使用模板简单而不是模板工具箱。不过它是直接在代码中配置的,我想绕过框架,而不是试图破译模板的特性。我可以将其序列化为JSON并进行ajax调用,而不是与框架抗争。感谢您的帮助David——这是模板配置。即使它是在代码顶部配置的,也必须在YAML配置中进行设置。奇怪的是,简单的解决方案能从仇恨中带来幸福。确认传递的数据将问题缩小到模板和最终的罪魁祸首。不客气,很高兴看到您将其排序。我将尝试重现您在运行时使用
setting
而不是在配置文件中选择模板引擎时看到的问题,因为它应该可以工作!对于一个非常基本的测试用例,它确实如我所期望的那样工作:啊哈-该测试用例可以工作,但是如果我添加一个config.yml文件,即使只是包含appname:test
,它也会停止工作。您在Dancer中发现了一个bug,我刚刚为其发布了一个问题,该问题应该很快得到解决-感谢您找到它!公开发行
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,
};
};