Алексей Мичурин
DBI – это Perl-модуль для взаимодействия с базами данных. Наверно, я не
сильно ошибусь, если скажу, что он используется в доброй половине всех
существующих Perl-программ. Можно ли его усовершенствовать или адаптировать,
пользуясь его объектно-ориентированной природой? Конечно!
Покопаться во внутреннем устройстве модуля DBI интересно по двум причинам.
Во-первых, он весьма популярен и используется в проектах самого разного
масштаба. Вам, я думаю, знакома ситуация: крупный проект развивался на MySQL
4.0, и, когда было накоплено немало кода, MySQL 4.0 сменили на 4.1. В этом
случае сразу возникают проблемы с кодировками. Наиболее универсальное решение –
выставлять кодировку после каждого вызова connect, но это может потребовать
скорректировать код многих сценариев.
Аналогичная ситуация возникает, когда с одной
базой работают комплексы программ, разработанные из расчёта на разные установки
времени; например, одна программа предполагает, что системные часы идут по
Гринвичу, а другая – по московскому времени. Тогда выставить единое время для
базы не представляется возможным и каждый клиент должен выставлять локальную
переменную time_zone. Как и в предыдущем, в этом случае есть два выхода: первый
– «перелопатить» весь код; второй – написать модуль, наследующий все свойства
DBI, но с некоторыми коррективами.
У каждого из этих подходов есть свои плюсы и
минусы, выбор во многом зависит от конкретной ситуации, но для крупных проектов
второй подход реализуется гораздо проще и быстрее, чем первый.
Кроме того, объектно-ориентированный подход более
универсален и позволяет решать не только эти, но и многие другие задачи.
Вторая причина, по которой обратиться к модулю
DBI будет весьма интересно, – это нетривиальность самого модуля. Как мы скоро
увидим, чтобы унаследовать методы этого модуля, совсем недостаточно строчки:
# для DBI это не работает
@ISA=qw(DBI);
В этом смысле рассмотрение модуля DBI может
подбросить разработчику пару ценных мыслей о том, как ему организовать свои
собственные модули, классы, объекты и методы.
Весь SQL-код и код, зависящий от используемой
базы данных, я буду писать, ориентируясь на MySQL, если вы работаете с другой
СУБД, то, возможно, вам придётся внести в код незначительные изменения.
Perl-составляющая кода и суть обсуждаемых в статье вопросов, конечно, от базы
не зависят.