Лучший способ использовать DBI в Perl для обновления строки и вывода ответа на строку cmd? - PullRequest
0 голосов
/ 24 марта 2011

Есть некоторый Perl-код, который использует модуль DBI - (код работает, я могу опубликовать его утром, если необходимо), - но в основном пытаюсь понять, что DBI нужно для обновления строки- и получите либо ошибки, либо подтверждение, что ОБНОВЛЕНИЕ было выполнено.

(Ниже приведен лишь базовый пример, не стесняйтесь приводить свой собственный пример и пример DDL, если хотите ... просто хочу, чтобы какой-то код, который, как я знаю, работал. Я выполнил свой код через отладчик Perl PtkDBи может "видеть" SQL, который он генерирует и выполняет - даже вставить в консоль MySQL и выполнить его ... но он ничего не делает в Perl, даже думая, что операторы select работают. В основном, просто хочу получить лучшее представление окак DBI обрабатывает UPDATE для MySQL, и если в DBI есть встроенная функция, которая сделает отладку более простой. Спасибо!)

Итак, пожалуйста, предоставьте один полный Perl-скрипт, который:

  • Устанавливает соединение (MySQL)
  • ВЫБЕРИТЕ строку два на основе идентификатора и получите имя и фамилию
  • Строчные имена
  • ОБНОВЛЕНИЕ таблицы
  • отключить

Пример ТАБЛИЦЫ

<COL01>Id <COL02>FirstName <COL03>LastName
<ROW01-COL01>1 <ROW01-COL02>John <ROW01-COL03>Smith
<ROW02-COL01>2 <ROW02-COL02>Jane <ROW02-COL03>Doe

ОБНОВЛЕНИЕ (1): Ниже приведен код вопроса.Единственное, что я изменил, это удалил код, не связанный с проблемой, и информацию о конфигурации (например, имя базы данных, пользователь, пароль и т. Д.) И сделал создание значений для переменных очень простым.Этот код был создан кем-то другим в устаревшей кодовой базе.

use strict;
use warnings;
use DBI;

sub dbOpen {
    my $dsn; 
    my $dbh;
    $dsn = "DBI:mysql:database=databasename;host=localhost;port=3306";
    $dbh = DBI->connect( $dsn, "root", "password" ) ||
    print STDERR "FATAL: Could not connect to database.\n$DBI::errstr\n";
    $dbh->{ AutoCommit } = 0;
    return($dbh);
} # END sub dbOpen

my $Data;
$Data = &dbOpen();

my ($sql,$rs,$sql_update_result);
my $column2,
my $column3;
my $id;
$column2 = 2,
$column3 = 3;
$id = 1;

$sql = "UPDATE table SET column1 = NULL, column2 = ".$column2.", column3 = ".$column3." WHERE id = ".$id.";";
$rs = $Data->prepare( $sql );
$rs->execute() || &die_clean("Couldn't execute\n$sql\n".$Data->errstr."\n" );
($sql_update_result) = $rs->fetchrow;

$Data->disconnect();

DDL для MySQL - при необходимости просто прокомментируйте, и я опубликую его.


ОБНОВЛЕНИЕ(2):

Final нашла один законченный пример, хотя он предназначен только для оператора select и даже не вставляет какие-либо VAR в SQL: http://search.cpan.org/~timb/DBI/DBI.pm#Simple_Examples

Ответы [ 4 ]

9 голосов
/ 24 марта 2011

Почти копирование и вставка из DBI Синопсис:

use DBI;
$dbh = DBI->connect($data_source, $username, $auth, \%attr);
$statement = "UPDATE some_table SET som_col = ? WHERE id = ?";
$rv  = $dbh->do($statement, undef, $som_val, $id); 
$DBI::err && die $DBI::errstr;
$rc  = $dbh->disconnect;
3 голосов
/ 24 марта 2011

Я предпочитаю использовать do при обновлении или удалении, поскольку эти операции не возвращают ни одной строки. Итак, для небольшой отладки я бы изменил ваш код следующим образом:

my $sql = "UPDATE table SET column1=NULL, column2=$column2, column3=$column3 WHERE id=$id";
print STDERR "SQL: $sql\n"

my $numrows = $Data->do($sql);

if (not defined $numrows) {
   print STDERR "ERROR: $DBI::errstr";
} else {
   print STDERR "INFO: $numrows rows updated";
}

Вы можете измерить время отклика на запрос из вашего perl-кода, но так как это вопрос базы данных, я рекомендую вам использовать любой специализированный инструмент Mysql (я не использую MySQL, извините).

2 голосов
/ 24 марта 2011

Вам не нужно возвращать значения, строчные буквы в Perl, а затем обновлять строки.Просто сделайте это в одном операторе SQL:

my $sql = "UPDATE table SET column2=lower(column2) WHERE id = ?";
$sth = $dbh->prepare($sql);
foreach my $id (@ids) {
    $sth->execute($id);
}

Вы также хотите использовать заполнители для предотвращения посещения таблиц Бобби .

2 голосов
/ 24 марта 2011

Рассматривали ли вы что-то немного более высокий уровень - например, DBIx :: Class ?

...