За прошедшие годы я заметил несколько проблем с SQL-запросами в скриптах Perl:
- Их трудно читать
- Большинство разработчиков не так уж хорошис SQL.
Допустим, у меня есть следующие таблицы:
PET PET_TYPE COLOR
======== ========== ============
PET_ID PET_TYPE COLOR_ID
Name Description Description
Owner
PET_TYPE
COLOR_ID
И, я хочу найти всех красных собак, мне придется произвести следующий запрос SQL.
FIND PET_ID, Name, Owner
FROM PET, PET_TYPE, COLOR
WHERE COLOR_ID.Description = 'RED'
AND PET_TYPE.Description = 'DOG'
AND PET.COLOR_ID = COLOR.COLOR_ID
AND PET.PET_TYPE = PET_TYPE.PET_TYPE
Я бы хотел модуль Perl, который упростил бы создание запросов.Что-то, что позволит мне создать соединение с базой данных, а затем заранее определить, как таблицы связаны.Как только это будет сделано, все, что нужно сделать разработчику, - это упрощенный запрос.
Я представляю интерфейс примерно так:
#
# Create a new Database Connection
#
my $db = Some:Module->new(\%options);
#
# Now describe how these tables relate to each other.
# It should be possible to reuse this information for
# multiple queries. Maybe even make this a subroutine
# or company wide Perl module that will do this for
# the developer.
#
$db->link_tables (
PET => "COLOR_ID",
COLOR => "COLOR_ID
);
$db->link_tables (
PET => "PET_TYPE",
PET_TYPE => "PET_TYPE",
);
#
# Now that you've created a link to the database,
# and you've describe how the tables relate to
# each other, let's create a query. I'm not 100%
# sure of the interface, but it'll be something
# like this. There might be multiple `query`
# statements.
#
my $query = $db->query (
PET_TYPE => "Description = DOG",
COLOR => "Description = RED"
);
#
# Now, execute this query
#
$db->execute_query;
while (%row = $db->fetch) {
say "Dog's name is $row{Pet.Name}";
say "The owner is $row{Pet.Owner}";
}
#
# Let's find all cats named Wiskers.
# We've already described the links,
# so that doesn't have to be redone.
#
my $query = $db->query (
PET_TYPE => "Description = CAT",
PET => "Name = Wiskers"
);
Я знаю, что мое описание неполное, и неважно как завершить модуль, должен быть аварийный аварийный люк, где вы можете выполнить необработанный SQL-запрос.Тем не менее, идея состоит в том, чтобы сконцентрировать программу на том, что вы хотите (я хочу рыжих собак или кошек по имени усы), а не на различных полях и тратить большую часть предложения Где на описание связей между таблицами.Это упростит программирование и сделает его более понятным.
Если такого модуля не существует, я его произведу.Однако, прежде чем потратить несколько недель на эту работу, я хочу убедиться, что я не дублирую какую-либо работу.