Почему Perl DBI требует инструкции подготовки перед выполнением?

В настоящее время я работаю над Perl script, и я очень к этому знаком. Я столкнулся с проблемой с Perl, потому что я привык к синтаксису PHP PHP, в котором вы создаете требуемый оператор, а затем выполняете его, а затем он отправляет информацию на серверную сторону.

Однако с Perl и модулем DBI требуется, чтобы вы создали инструкцию, подготовили оператор и затем выполнили оператор, отправляющий информацию на сервер.

Это потому, что Perl аналогичен высокоуровневому языку программирования и содержит внутри него практический компилятор, который требует выполнения этой инструкции подготовки перед выполнением?

Я использую инструкцию по обновлению MySQL, она специфична для операторов (update vs select)?

Когда я говорю "создаю выражение", я имею в виду что-то вроде:

$query = "UPDATE table SET column = value";

Возможно, я не сделал достаточно исследований по этой теме?

Ответ 1

На самом деле вам не нужно напрямую использовать prepare (есть несколько ярлыков.) Но с помощью этого вы можете сообщить драйверу базы данных о одном из операторов, который может быть повторно выполнен без необходимости перекомпилировать базу данных каждый раз, Например

my @records = ( [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8 9 ] );
my $sth = $dbh->prepare( "INSERT INTO foo VALUES ( ?, ?, ? )" );
foreach my $record( @records ) { 
    $sth->execute( @$record );
}

Это будет выполнять один и тот же подготовленный оператор три раза, по одному для каждого набора из трех значений в @records. Это также демонстрирует использование заполнителей ?, которые вы всегда должны использовать вместо интерполяции переменных непосредственно в строки SQL.

Если вам нужно только выполнить инструкцию один раз, вы можете объединить инструкции подготовки и выполнения в один шаг:

$dbh->do( "INSERT INTO foo VALUES ( ?, ?, ? )", undef, 1, 2, 3 );

Первым аргументом является строка SQL (предпочтительнее с заполнителями), секундами является необязательный атрибут хэша (слева undef здесь), а остальные параметры - это то, что заменяется на заполнители.

Ответ 2

Вам нужно только подготовить(), если вы хотите выполнить запрос более одного раза, не разыгрывая его каждый раз.

В вашем простом случае я бы использовал метод do.

$query = "UPDATE table SET column = value";
$rows = $dbh->do($query) or die $dbh->errstr;