使用一些使用DBI模块的Perl代码 - (代码在工作,我可以在早上发布,如果需要) - 但主要是试图了解DBI需要做什么来更新到一行 - 并返回错误,或确认已执行UPDATE。
(下面只是一个基本的例子,如果你愿意,可以随意提供你自己的例子和示例DDL ...只是想要一些我知道的代码。我通过Perl PtkDB调试器运行我的代码,并且可以“看到”它生成和执行的SQL - 甚至粘贴在MySQL consol中并执行它......但它在Perl中什么都不做,甚至认为select语句正在工作。主要是想更好地了解DBI是如何工作的处理UPDATE到MySQL,如果DBI中有任何内置功能可以使调试更简单。谢谢!)
因此,请提供一个完整的Perl脚本:
示例表
<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();
MySQL的DDL - 如果需要,只需发表评论,我会发布一个。
更新(2):
最终找到了一个完整的例子,虽然它仅用于select语句,甚至没有将任何VAR插入SQL:http://search.cpan.org/~timb/DBI/DBI.pm#Simple_Examples
答案 0 :(得分: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;
答案 1 :(得分:3)
我更喜欢在更新或删除时使用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 :(得分:2)
您是否考虑过更高级别的内容 - 例如DBIx::Class?
答案 3 :(得分:2)
您不需要返回值,在Perl中将它们小写,然后更新行。只需在一个SQL语句中执行此操作:
my $sql = "UPDATE table SET column2=lower(column2) WHERE id = ?";
$sth = $dbh->prepare($sql);
foreach my $id (@ids) {
$sth->execute($id);
}
您还希望使用占位符来阻止Bobby Tables访问。