Catalyst::Model::DBI с поддержкой UTF-8 (original) (raw)

Практика показала, что использование DBIx::Class не всегда оправдано — трудно писать сложные запросы, да и количество выполняемых им лишних телодвижений удручает.

Среди альтернативных вариантов — использование DBI. Для него, естественно, на CPAN уже есть модель Catalyst::Model::DBI, однако её хелпер создаёт модуль, который (при работе с MySQL) не дружит с UTF-8. Что вполне поправимо: достаточно добавить в настройки подключения атрибут mysql_enable_utf8 и переопределить метод connect, добавив туда выполнение запроса SET NAMES utf8.

Готовый вариант модели — https://gist.github.com/752990


User: dolbanavt
Date: 2010-12-23 15:21 (UTC)
Subject: (no subject)

Может я что-то важное упустил когда стал пользоваться Catalyst::Model::DBI для полностью юникодных проектов?

Просто в конфиг модели добавил:

options => {
mysql_enable_utf8 => 1,
Callbacks => {
connected => sub { shift->do( q{SET NAMES utf8} ); return; },
},
}

| 1blueskydreamer | | | ----------------------------------------------------------------------------------------- | |

А, чем DBI лучше Class:DBIx?
Точнее, чего он не может сделать? Мне казалось, что он позволяет писать запросы любой сложности...
Кстати, "узнаю брата Колю", тоже пишем на Perl с MS SQL. :)

DBIx::Class — это ещё более высокая абстракция от базы данных, чем DBI. То есть, ситуация схожа, например, с сравнением языков программирования: у си уровень выше, чем у ассемблера, но ниже, чем у перла. Это не хорошо и не плохо — это просто языки разных уровней.

Простые запросы на DBIx::Class делать проще, чем писать SQL, когда используешь DBI. Но сложные — труднее: надо сильно погружаться в мануал, да и доступных материалов по DBIx::Class на порядки меньше, чем по SQL.

| 1blueskydreamer | | | ----------------------------------------------------------------------------------------- | |

Из Calss:DBIx всегда можно вытащить DBI handle и делать все самому ручками. Но мне ни разу не приходилось. Голимый SQL всегда можно воткнуть в DBIx::Class::ResultSource::View. А отказываясь от DBIx, отказываешься от разный вкусностей, типа HTML::FormHandler и inflation.

В чем поинт?

User: adtim
Date: 2010-12-24 17:17 (UTC)
Subject: (no subject)

DBIx:Class делает лишние телодвижения только в случае криво написаного кода.
После написания сложной функции делаю трассировку запросов и довожу до состояния "как сам бы написал на sql".

А для запросов, которые удобнее писать на sql получаю dbh хэндлер вот так или dbh_do.

Для простых задач есть сочни DBIx::Simple.