Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Mojo & SQLite


Автор: Marlik 21.5.2015, 17:16
Здравствуйте люди. Пытаюсь скрестить Mojo и SQLite, делаю так:

Создаю базу, образец отсюда - http://pragmaticperl.com/issues/06/pragmaticperl-06-dbixclass-%D0%B2-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B0%D1%85.html

sqlite3 blog.db < blog.sql

Создаю схему:

dbicdump -o dump_directory=./lib -o components='["InflateColumn::DateTime"]' Schema dbi:SQLite:./dump/blog.db

Проверил, всё физически имеется и база и схема.

В MyApp:

use Schema;
has schema => sub {
  return Schema->connect('dbi:SQLite:' . ($ENV{BLOG_DB} || './dump/blog.db'));
};

В startup:

$self->helper(db => sub { $self->app->schema });

Пытаюсь инсёртить в базу из контроллера:

    my $self = shift;

    my ($title, $body, $tags) = @{$self->req->params->to_hash}{ 'title', 'body', 'tags' };

    my $result = $self->db->resultset('Post')->create({
    title => '$title',
    post  => '$body',
    tags => '$tags'
    });

Получаю ошибку что таблицы posts нету. Но она присутствует!

DBIx::Class::Storage::DBI::_prepare_sth(): DBI Exception: DBD::SQLite:smileb prepare_cached failed:
no such table: posts [for Statement "INSERT INTO posts ( post, tags, title) VALUES ( ?, ?, ? )"] at /var/www/myapp/script/../lib/MyApp/Controller/Blog.pm line 23


 Подскажите куда двигаться? Спасибо. 


Автор: tzirechnoy 21.5.2015, 20:19
Цитата
 Но она присутствует!


Почему Вы так думаете?

Автор: Marlik 21.5.2015, 20:44
Цитата(tzirechnoy @ 21.5.2015,  20:19)
 
Цитата
Но она присутствует!


Почему Вы так думаете?








Потому что есть дамп blog.sql, вот он:

CREATE TABLE authors (
    authorid    INTEGER PRIMARY KEY AUTOINCREMENT,
    author      VARCHAR(255) UNIQUE,
    pass    VARCHAR(255),
    type    INTEGER
);

CREATE TABLE posts (
    postid      INTEGER PRIMARY KEY AUTOINCREMENT,
    title    TEXT,
    post        TEXT,
    tags    TEXT,
    postime     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    authorid    REFERENCES authors(authorid)
);

CREATE TABLE comments (
    commentid   INTEGER PRIMARY KEY AUTOINCREMENT,
    comment     TEXT,
    comtime     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    authorid    REFERENCES authors(authorid),
    postid      REFERENCES posts(postid)
);

Потом командой sqlite3 blog.db < blog.sql создаю базу, я её вижу, могу открыть и посмотреть... как-то так. Спасибо.



Автор: noize 22.5.2015, 18:05
Напишите структуру вашего проекта, где лежит файл .db, где лежат перловые модули. Работать с относительными директориями - плохая практика, не факт, что у моджо где-то внутри не вызывается команда chdir

Автор: Marlik 22.5.2015, 22:21
Структура моджо стандартная, где лежит дамп и куда поставилась Shema видно выше в посте. 

Автор: noize 23.5.2015, 12:46
если папка dump лежит в корневой директории моджо-проекта, т.е. на одном уровне с папками lib, public, template и т.д., то абсолютный путь к файлу .db можно получить вот так:
Код

my $db_file = $self->home->rel_file( 'dump/blog.db' );
chomp $db_file;

и уже дальше использовать его в подключении к бд:
Код

use Schema;
has schema => sub {
    return Schema->connect( 'dbi:SQLite:' . $db_file );
};

Автор: Marlik 24.5.2015, 12:02
Фишка вся в том, что, когда я меняю путь к базе, выскакивает ошибка, что мол базы нет. Открывал вручную базу в sqlite3 нормально видит базу, показывает структуру. Попробую ещё раз с нуля. И да, у вас ошибка. 

Автор: Marlik 25.5.2015, 12:35
Проблема из-за того что я всё делал из под рута. Век живи, век учись.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)