Модуль Perl для упрощения SQL-запросов - PullRequest
2 голосов
/ 23 января 2012

За прошедшие годы я заметил несколько проблем с 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-запрос.Тем не менее, идея состоит в том, чтобы сконцентрировать программу на том, что вы хотите (я хочу рыжих собак или кошек по имени усы), а не на различных полях и тратить большую часть предложения Где на описание связей между таблицами.Это упростит программирование и сделает его более понятным.

Если такого модуля не существует, я его произведу.Однако, прежде чем потратить несколько недель на эту работу, я хочу убедиться, что я не дублирую какую-либо работу.

Ответы [ 2 ]

7 голосов
/ 23 января 2012

Я думаю, что вы ищете ORM, и таких много.Хотя это не совсем то, что вы описываете, оно довольно близко подходит с функциональной точки зрения.Взгляните на Class :: DBI и DBIx :: Class, или просто Google для Perl ORM.

2 голосов
/ 23 января 2012

Существует довольно много модулей: Class :: DBI, Rose :: DB, DBIx :: Class.Хотя DBIx :: Class является более мощным и сильно обновленным, Class :: DBI проще в использовании.Позже, если вы захотите переключиться на DBIx :: Class, вы можете сделать это без особых усилий.

...