Я надеюсь, что приведенное ниже достаточно самоочевидно:
package My_App::Table_Name;
use feature 'state';
# save performance hit on `prepare` statements
# you said SQL statements of 100+ lines
sub sql_name {
my $class = shift;
my $dbh = shift;
my %params = @_;
# do some checking on the params if needed, or use Type::Params::compile
state $sth = $dbh->prepare( << END_OF_SQL ); # 4 spaces for neatness
SELECT * FROM table_name WHERE col_foo = ? AND col_bar = ?
END_OF_SQL
$sth->execute(
$params{foo},
$params{bar},
);
return $sth->fetchall_hashref('id'); # or what ever
}
1;
А затем в вашем приложении:
use strict;
use warnings;
use DBI;
use My_App::Table_Name;
my $dbh = ... ; # RaiseError is your friend
my $results = My_App::Table_Name->sql_name($dbh,
foo => 'abc',
bar => '123',
);
# $results now contains a HashRef where the keys are the id's from the returned
# rows, each row being a HashRef itself, so you can do things like:
say $results->{42}->{col_foo};
Таким образом, вы можете организовать свои операторы SQL по имени таблицы, чаще всегоИзменения базы данных выполняются для одной таблицы или из-за изменений внутри одной таблицы, что приводит к цепочке отключений обновлений в других местах.
Внутри каждого модуля теперь можно создавать подпрограммы с разумными именами, такими как
sub create { ... };
sub delete { ... };
sub search_joined_with_table_other { ... };
и, следовательно, в вашем приложении:
My_App::Table_Name->create($dbh,
foo => 'xyz',
bar => '345',
);
My_App::Table_Other->delete($dbh, id => 42 );
Итак, в принципе, вы НЕ заботитесь обо всех этих SQL-кодах внутри вашего основного приложения, а просто удалили их внутри своих собственных пакетов.А внутри вашего приложения вам даже не нужно знать, что под капотом находится SQL, вы просто вызываете методы класса.
На следующем уровне будет возвращаться объект Row для каждого пакета Table_Name и иметь свои собственные методы экземпляра.на нем.
Удачного кодирования и запоминания TIMTOWTDI (есть несколько способов сделать это)