Как делают я вставляю пустые поля с DBD Perl:: Pg?

У меня есть сценарий Perl, вставляющий данные в Пост-ГРЭС согласно файлу разделенного текста канала. Иногда, поле является пустым (как ожидалось). Однако Perl превращает это поле в пустую строку, и Пост-ГРЭС вставляет сбои оператора.

Вот отрывок кода:


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]);
}

И если вход:

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 вместо этого. Какие-либо идеи?

Править: Я упростил вход в последнюю минуту. Старый вход на самом деле заставил его работать по некоторым причинам. Таким образом, теперь я изменил вход на что-то, что сделает сбой программы. Также обратите внимание, что field1 является nullable целочисленным типом данных.

5
задан brian d foy 18 May 2010 в 23:17
поделиться

3 ответа

Я не уверен, что вы проверили, работают ли ваш вставленный код и данные вместе с Perl 5.10.1, DBD :: Pg 2.15.1 и Postgres 8.4. Также вы должны использовать строгие и предупреждения и не полагаться на область пакета для ваших переменных.

Если вы измените свой код и данные для использования трех или более полей, оставив нетерминальное одно пустым, вы можете вызвать ошибку из DBD :: Pg. Добавьте такую ​​строку в свой код перед выполнением подготовленного оператора:

map { $_ eq '' and $_ = undef } @field;

Сопоставить пустые строки в @field с undef

4
ответ дан 14 December 2019 в 08:44
поделиться

Пакет DBI преобразует undef в NULL . (Логика Perl определенности и ложности на самом деле очень хорошо подходит для троичной логики SQL.)

Итак, в вашем цикле while просто проверьте, является ли указанное поле пустой строкой, и если поэтому сделайте вместо него undef :

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

    if ( $field[1] eq '' ) { 
        # handle NULLs
        $field[1] = undef;
    }

    #Do the insert.
    $sth->execute($field[0],$field[1]);
}
2
ответ дан 14 December 2019 в 08:44
поделиться

undef обычно отображается в NULL. Похоже, вы вставляете пустую строку, которая отличается от undef .

1
ответ дан 14 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: