如何使用Perl的DBD :: Pg插入空字段?

Use*_*er1 5 postgresql perl dbi

我有一个Perl脚本根据管道分隔的文本文件将数据插入Postgres.有时,字段为空(如预期的那样).但是,Perl将此字段设置为空字符串,并且Postgres插入语句失败.

这是一段代码:


use DBI;

#Connect to the database.
$dbh=DBI->connect('dbi:Pg:dbname=mydb','mydb','mydb',{AutoCommit=>1,RaiseError=>1,PrintError=>1});

#Prepare an insert.
$sth=$dbh->prepare("INSERT INTO mytable (field0,field1) SELECT ?,?");

while (<>){
    #Remove the whitespace
    chomp;

    #Parse the fields.
    @field=split(/\|/,$_);

    print "$_\n";

    #Do the insert.
    $sth->execute($field[0],$field[1]);
}
Run Code Online (Sandbox Code Playgroud)

如果输入是:

a|1
b|
c|3

编辑:改为使用此输入.

a|1|x
b||x
c|3|x

它会失败的b|.

DBD::Pg::st execute failed: ERROR:  invalid input syntax for integer: ""

我只是想让它在field1上插入一个null.有任何想法吗?

编辑:我在最后一分钟简化了输入.旧的输入实际上由于某种原因使它工作.所以现在我将输入改为使程序失败的东西.另请注意,field1是可以为null的整数数据类型.

MkV*_*MkV 5

我不确定您是否测试了粘贴的代码和数据,它们是否适用于 Perl 5.10.1、DBD::Pg 2.15.1 和 Postgres 8.4。此外,您还应该使用严格和警告,而不是依赖于变量的包范围。

如果您更改代码和数据以使用三个或更多字段,并将非终端字段留空,则可以从 DBD::Pg 触发错误。在执行准备好的语句之前,将这样的行添加到代码中:

map { $_ eq '' and $_ = undef } @field;
Run Code Online (Sandbox Code Playgroud)

将 @field 中的空字符串映射到 undef