Perl Dancer: передача информации о базе данных в шаблон

StackOverflow https://stackoverflow.com/questions/4697856

  •  11-10-2019
  •  | 
  •  

Вопрос

Следующий учебник здесь:

http://search.cpan.org/dist/dancer/lib/dancer/tutorial.pod

Я использую свою собственную базу данных 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 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 %>

Производит страницу, но без данных. Как я могу устранить это, так как в консоли/CLI нет подсказок?

* ОБНОВИТЬ *Если я изменю код базы данных на это:

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,
    };
};

Я получаю один результат из таблицы в шаблоне. Таким образом, информация передается, но синтаксис для шаблона не работает, как описано. Это соответствует синтаксису Template Toolkit.

Спасибо

Бубнофф

Редактировать/разрешение **

Дэвид напомнил мне данные :: Dumper, что подтвердило, что проблема действительно была с конфигурацией шаблона. Я прокомментировал директиву шаблона в файле конфигурации, думая, что она будет избыточной, поскольку она была в самом коде. НЕПРАВИЛЬНЫЙ!!! Он должен быть настроен в YAML. Удаление октября в конфигурации Установите все права. Теперь я просто смущен тем, что не пробовать данные :: в первую очередь. Спасибо, Дэвид!

Это было полезно?

Решение

Прежде всего, убедитесь, что вы передаете то, что, по вашему мнению, проходите в шаблон.

Назначьте результат $ sth-> fetchall_hashref ($ key_field) временному скаляру, затем сбросьте его с помощью data :: dump или data :: dumper (или см. Dancer :: плагин :: DebugDump для того, чтобы сделать это легко).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top