使用Perl的DBI更新行的最佳方法,并将响应打印到cmd-line?

blu*_*ers -2 perl dbi

有一些使用DBI模块的Perl代码 - (代码在工作,如果需要我可以在早上发布) - 但主要是试图了解DBI需要对行进行更新 - 以及得到错误,或确认已执行UPDATE.

(下面只是一个基本的例子,如果你愿意,可以随意提供自己的示例和示例DDL ...只需要一些我知道的代码.我通过Perl PtkDB调试器运行我的代码,并且可以"看到"它生成并执行的SQL - 甚至粘贴在MySQL consol中并执行它......但它在Perl中什么都不做,甚至认为select语句正在工作.主要是想更好地了解DBI如何处理UPDATE到MySQL,如果DBI中有任何内置功能可以使调试更加简单.谢谢!)

所以,请提供一个完整的Perl脚本:

  • 设置连接(MySQL)
  • 根据ID选择第二行并获取名字和姓氏
  • 小写名称
  • 更新表格
  • 断开

样本表

<COL01>Id <COL02>FirstName <COL03>LastName
<ROW01-COL01>1 <ROW01-COL02>John <ROW01-COL03>Smith
<ROW02-COL01>2 <ROW02-COL02>Jane <ROW02-COL03>Doe
Run Code Online (Sandbox Code Playgroud)

更新(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();
Run Code Online (Sandbox Code Playgroud)

MySQL的DDL - 如果需要,只需评论,我会发布一个.


更新(2):

Final找到了一个完整的例子,虽然它只用于select语句,甚至没有将任何VAR插入SQL:http://search.cpan.org/~timb/DBI/DBI.pm#Simple_Examples

w.k*_*w.k 9

几乎从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;
Run Code Online (Sandbox Code Playgroud)

  • `do`在出错时返回受影响的行数或`undef`.如果出现错误,`DBI :: err`将包含本机数据库引擎错误代码.`DBI :: errstr`将保存错误消息. (2认同)