Я читал некоторые рецепты в книге Perl Hacks. Рецепт № 24 «Запросы к базам данных динамически без SQL» выглядел интересно. Идея состоит в том, чтобы использовать SQL-Abstract для генерации оператора SQL для вас.
Синтаксис для генерации оператора выбора выглядит примерно так:
my($stmt, @bind) = $sql->select($table, \@fields, \%where, \@order);
Чтобы проиллюстрировать это, пример может выглядеть так (взято из perldoc):
my %where = (
requestor => 'inna',
worker => ['nwiger', 'rcwe', 'sfz'],
status => { '!=', 'completed' }
);
my($stmt, @bind) = $sql->select('tickets', '*', \%where);
Выше приведено что-то вроде этого:
$stmt = "SELECT * FROM tickets WHERE
( requestor = ? ) AND ( status != ? )
AND ( worker = ? OR worker = ? OR worker = ? )";
@bind = ('inna', 'completed', 'nwiger', 'rcwe', 'sfz');
Что вы можете затем использовать в коде DBI следующим образом:
my $sth = $dbh->prepare($stmt);
$sth->execute(@bind);
Теперь иногда порядок столбцов в предложении WHERE
очень важен, особенно если вы хотите эффективно использовать индексы.
Но, поскольку столбцы генератора предложений WHERE
в SQL-Abstract указываются с помощью хэша - и, как известно, порядок извлечения данных из хэшей perl не может быть гарантировано - вы, похоже, потеряете возможность указать порядок столбцов.
Я что-то упустил? Есть ли альтернативный способ гарантировать порядок появления столбцов в предложении WHERE
при использовании SQL-Abstract ?