Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > правильная работы с DBI |
Автор: gcc 7.3.2009, 05:13 | ||||
столкнулся с проблемой, есть база данных в которой из всех таблиц есть 3-4 таблицы и с ними все время надо работать, у них много int занечений при запросе нужно делать программное построение запросов... и это очень портит программу... примерно вот так только еще больше усложнить условий:
по-моиму это как-то криво, или нет? мне ORM не понравился сразу, может быть тут есть какие-то ньюансы при использвоании DBI, сделать нужно свой класс, но а что именно чтобы в нем было? или "забит" на sql и использовать DBIx::Class? |
Автор: klem4 7.3.2009, 10:31 | ||||
Мм ну оптимизировать тут определенно можно, возможно не тот момент, что вы казали. Во-первых по моему после выполнения вот этого кода в самом начале:
Следующая за ним ветка не выполнится никогда ....
Думаю стоит начать с этого. |
Автор: gcc 7.3.2009, 16:34 |
какая ветка? я просто так это написал для примера, я не про это спрашивал... не красиво выглядит когда есть большой запрос и его надо массива строить... и if else усложнить более не читаемое суть действия... |
Автор: tolkien 8.3.2009, 07:26 |
Вы можете сделать так: 1. создать отдельно файл pl (sub1.pl) в котором определить процедуры 2. в основном файле загрузить этот файл через do соответ. код в основном файле будет чистым и содержать только вызовы процедур определенных в файле sub1.pl |
Автор: Vaneska 8.3.2009, 20:01 | ||
1. Если у Вас таких запросов единичные случаи, то наверно не стоит сильно чего-то менять, единственное что надо сделать - как можно тщательней причесать код, поставить комментариев побольше, чтобы сразу можно было понять, что к чему. 2. Если все таки хочется хоть как-то унивесиализировать код, то я делаю что-то на подобие такого:
Естественно это абстрактный пример, но идея, надеюсь, понятна. |
Автор: IceSunrise 10.3.2009, 10:47 |
А почему вам сразу ORM не понравился? DBIx::Class для таких целей и предназначен. |
Автор: KSURi 10.3.2009, 13:55 |
UPD: не так понял первый пост сначала Посмотрите в сторону SQL::Abstract. Менее комплексный модуль, но для простого составления запросов может подойдет |
Автор: gcc 11.3.2009, 05:13 | ||||||
не понравилось тем что не видел большого приемущества, там есть некоторые вещи по лучше, например insert_update() мне показалось что ради этого не стоит пробовать... тем более оно уменьшает код по численности, но не по логике, так показалось по крайнем мере... больше не увидел новых вещей... а что там еще есть полезно? но в книге и везде рекомендовано использовать именно это, буду использовать, DBIx::Class, значит еще есть
недавно увидел DBIx::Abstract не много больше возможностей, но в каталисте нету модели для него, но можно сделать легко из DBI... |
Автор: dmitryk1 11.3.2009, 07:03 |
Вообще странно, что приходится так эти запросы конструировать... Видимо что-то не правильно спланировано. Лучше сделать несколько запросов. Полных. Отражающих суть приложения, а потом получать их из хэша в зависимости от условий. Типа: Если 'Admin' то $ps->{Admin} а в $ps->{Admin} лежит полный готовый и неизменяемый селект. Ну и разумеется везде в запросах "?" используется, чтобы уж совсем единичных запросов не было. |
Автор: IceSunrise 11.3.2009, 10:10 | ||
ORM преследует вполне конкретные цели. Во-первых, вы уходите от конкретного типа СУБД и ее специфических языковых конструкций. Во-вторых, теоритически, ваш код сможет читать и поддерживать человек, не знающий SQL, хотя это достаточно сложно представить ![]() |
Автор: gcc 12.3.2009, 04:34 | ||||
а вот как это можно:
первый вариант очень плохой? |
Автор: gcc 15.3.2009, 05:17 |
кто знает, кто использовал в чем разница в удобстве между Rose::DBx и DBIx::Class? я не вижу, но интересно... |
Автор: gcc 25.3.2009, 17:04 | ||
хочется спросить вопрос такого плана, не много оффтопик... правильно ли написан код в низу, не очень ли глупо он выглядит? я не много под другому написал чем в предыдущие разы... ORM я решил использовать в конце, то есть перевести некоторые запросы в больших модулях, в этом примере самый маленький модуль.... если выглядит плохо, то можно примеры на какой-то готовый код для примера, чтобы посмотреть, желательно тыкнуть пальцем (для обрабоки данных с форм я решил сделать класс другой, сейчас без него)
|
Автор: gcc 25.4.2009, 10:16 |
использую DBIx::Abstract и DBI http://search.cpan.org/~turnera/DBIx-Abstract-1.006/Abstract.pm DBIx::Abstract сразу просит ввести данные для подключения если я инициализирую два модуля, то будет 2 соединения к СУБД или одно? если два, то как передать $dbh в DBIx::Abstract? тут вот нашел модуль для переопределения модели... не понятно зачем он сделан http://desert-island.me.uk:8888/~castaway/dbic-html/DBIx/Class/Storage.html |
Автор: gcc 5.6.2009, 06:36 | ||
нашел еще DBIx::SQLEngine http://search.cpan.org/~evo/DBIx-SQLEngine-0.93/SQLEngine.pm подскажите, эта штука даст асбтаркуцю чтобы сразу работало хотя бы sqlite, mysql и pgsql?
например, Rose::DBx не делат чтобы сразу на всех базах работало!!? только DBIx::Class и Class::DBIx? |
Автор: gcc 6.6.2009, 08:48 |
помогите перевести с английского? Dynamic subclassing based on database server type enables cross-platform portability This allows the driver-specific subclasses to compensate for differences in the SQL dialect or execution ideosyncracies of that platform. это имеется ввиду что оно как ОРМ, те запросы в абстракции которые написать они сразу на нескольких СУБД будут работать? или нет? |
Автор: KSURi 6.6.2009, 09:00 |
Динамическое наследование, в зависимости от типа сервера, позволяет получить кроссплатформенность. Оно позволяет наследникам от классов-драйверов "не обращать внимание" на разности SQL диалектов и индивидуальные особенности платформы. Примерно так. Имеется ввиду, что для того, чтобы сменить тип базы для скрипта, надо только изменить наследумый драйвер. |
Автор: gcc 6.6.2009, 09:06 |
спасибо, то есть так как ORM... (это очень похоже на SQL::Abstract) |
Автор: gcc 7.6.2009, 10:48 |
вот только последнее изменения в DBIx::SQLEngine вносились 2004 году, 5 летней давности написано на cpan.org в поиске.... |