gpt4 book ai didi

Perl/DBI/FreeTDS/SQLAzure 一些插入被忽略

转载 作者:行者123 更新时间:2023-12-05 00:47:48 27 4
gpt4 key购买 nike

我在使用 DBI 和 FreeTDS(在 Ubuntu 上)将一些数据插入 SQL Azure 时遇到了 Perl 的间歇性问题。可能会出现问题,并且忽略了某些行,然后我可以再次运行它而不会出现问题。

脚本:

print "Importing File $file: to Staging Table\n";
open my $info, $file or die "Could not open $file: $!";

$dbh->do("EXEC DWTOOLS.InitStage;") or die $DBI::errstr ; #truncates the table

my $sth = $dbh->prepare("INSERT INTO DWSTAGE.CDRImport (LINE) VALUES(?);") or die $DBI::errstr ;
my $counter = 0;
while( my $line = <$info>) {
$line =~ s/\r?\n$//;
$counter++;
print "Loading line $counter: $line\n" ;
my $rc = $sth->execute($line) or die $DBI::errstr ;
print "Result: $rc\n";
}
close $info;


print "\nChecking Data Warehouse: $counter lines expected\n" ;
my $checksth = $dbh->prepare("EXEC DWTOOLS.CheckStage ?;") or die $DBI::errstr ;
my $checkrc = $checksth->execute($counter) or die $DBI::errstr ;

my @row;
while ( @row = $checksth->fetchrow_array( ) ) {
print "Row: @row\n";
}

给出输出:
Importing File filename: to Staging Table
Loading line 1: data redacted
Result: 1
Loading line 2: data redacted
Result: 1
etc. etc. with no indication of errors
Loading line 165: data redacted
Result: 1
Loading line 166: data redacted
Result: 1

Checking Data Warehouse: 166 lines expected
Row: 35 166
Row: 35 166
Loading to Data Warehouse

因此,当我查看表格时,它表明所有开始行都丢失了直到它开始工作时的某个点 - 可靠 - 直到结束 - 所以基本上,文件的最后 35 行被加载,它们从 1 开始上升到 35,其中第 1 行实际上是第 (166-35+1) 行或其他任何内容。 Azure 中的表有一个 PK 集群 IDENTITY 列,它从 1 开始并且没有间隙,因此就像第一次删除了如此多的插入而没有任何错误迹象。这发生在各种文件、各种大小和文件中的各个位置。

文件在循环中处理,每个文件都被打开、处理和关闭,以防与这种奇怪的行为有任何关系。该语句是为每个文件重新准备一次,但 SQL Azure 连接会在程序的整个生命周期内维护,如果这可能会导致问题。如果连接失败,我仍然希望程序死掉,但是从没有从执行返回的错误代码来看,我不相信我会得到任何错误指示。

如果我继续并重新运行程序,所有行都进来了,一切都很好。

我不确定要得出什么结论。现在,我的结论是 FreeTDS 有缺陷且不可靠。

最佳答案

看起来 DB 在截断过程完成之前正在执行插入。如果这是一个存储过程,您可以添加某种标志它已完成并在继续之前检查它。或者最好还是将整个 db 调用集包装到一个事务中。

关于Perl/DBI/FreeTDS/SQLAzure 一些插入被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com