Perl / Dancer и СУБД

в 14:11, , рубрики: Dancer, database, dbi, perl, метки: , , ,

Сегодня пробежимся по работе с базами данных при web-разработке с использованием Dancer. Думаю, не совру, если скажу, что многие из нас любят perl за то, что, в частности, есть более одного пути добиться желаемого результата.
Pure DBI

Разумеется, вы можете использовать просто привычный DBI и не читать дальше совершенно:) К недостаткам такого подхода можно отнести лишь относительно бОльшее количество писанины и необходимость смешивать perl и SQL (хотя это и можно обойти достаточно просто).
Dancer::Plugin::Database

Это такой правильный, предполагаемый авторами фреймворка по умолчанию вариант. По сути своей является потомком DBI::db, наследуя методы и переменные и добавляя небольшие обертки, позволяющие добавить немного магии и убрать SQL в подавляющем большинстве типовых запросов необходимых для web.
В простейшем случае использование этого подхода будет выглядеть так:
use Dancer;
use Dancer::Plugin::Database;

# Используя ключевое слово database, вы получаете подключенный к базе хэндл, который можно
# использовать так:

get '/widget/view/:id' => sub {
my $sth = database->prepare(
'select * from widgets where id = ?',
);
$sth->execute(params->{id});
template 'display_widget', { widget => $sth->fetchrow_hashref };
};

# Этот хэндл является экземпляром Dancer::Plugin::Database::Handle, который можно использовать
# еще и вот так
get '/insert/:name' => sub {
database->quick_insert('people', { name => params->{name} });
};

get '/users/:id' => sub {
template 'display_user', {
person => database->quick_select('users', { id => params->{id} }),
};
};

dance;

Спасибо perldoc Dancer::Plugin::Database за предоставленный код:)
Возникает вопрос, откуда же Dancer узнает о том к какой СУБД необходимо подключаться? Как и многие вопросы в Dancer, этот приведет вас к config.yml
Вот пример для mysql (ещё раз спасибо perldoc Dancer::Plugin::Database)
plugins:
Database:
driver: 'mysql'
database: 'test'
host: 'localhost'
port: 3306
username: 'myusername'
password: 'mypassword'
connection_check_threshold: 10
dbi_params:
RaiseError: 1
AutoCommit: 1
on_connect_do: ["SET NAMES 'utf8'", "SET CHARACTER SET 'utf8'" ]
log_queries: 1

Разумеется это вовсе не ORM, но позволяет, с одной стороны, не городить огород с DBIx, а с другой стороны — избавиться от кусков SQL в основном коде.
DBIx

Про DBIx просто упомяну здесь как про ещё один вариант работы с СУБД. Вот есть такая штука и если вы хотите большой и чистой любви ORM для своего проекта, тогда, вероятно, вам будет любопытно взглянуть на неё. Для относительно небольших проектов, для которых хорошо подходит Dancer (на мой взгляд это его ниша), мне представляется нецелесообразным применять DBIx и поэтому я не буду подробнее писать про это.
Мне всегда казалось, что подобного рода тексты должны очерчивать круг возможностей, не предлагая «100 рецептов сделать что-то», поэтому на этом считаю свою задачу выполненной, до следующего раза. А в следующий раз мы поговорим о самом, пожалуй, важном — об обработке форм.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js