簡體   English   中英

Perl DBI和sql now()

[英]Perl DBI and sql now()

我在更新表時一直在嘗試使用sql NOW()函數。 但是那個日期字段沒有任何反應,我認為DBI只是忽略了這個價值。 代碼是:

dbUpdate($id, (notes => 'This was an update', filesize => '100.505', dateEnd => 'NOW()'));

功能是:

sub dbUpdate {
    my $id = shift;
    my %val_hash = @_;
    my $table = 'backupjobs';

    my @fields = keys %val_hash;
    my @values = values %val_hash;

    my $update_stmt = "UPDATE $table SET ";
    my $count = 1;
    foreach ( @fields ) {
        $update_stmt .=  "$_ = ? ";
        $update_stmt .=  ', ' if ($count != scalar @fields);
        $count++;
    }
    $update_stmt .= " WHERE ID = ?";
    print "update_stmt is : $update_stmt\n";
    my $dbo = dbConnect();
    my $sth = $dbo->prepare( $update_stmt );
    $sth->execute( @values, $id ) or die "DB Update failed : $!\n";
    $dbo->disconnect || die "Failed to disconnect\n";
    return 1;
}#dbUpdate

正如您所看到的,這是一個“動態”生成的sql查詢,因此我不知道sql日期函數(如now())的位置。

在給定的示例中,sql查詢將是

UPDATE backupjobs SET filesize = ? , notes = ? , dateEnd = ?  WHERE ID = ?

與param值

100.55, This was an update, NOW(), 7

但是日期欄仍顯示0000-00-rt

任何想法如何解決這一問題 ?

我在更新表時一直在嘗試使用sql NOW()函數。 但是那個日期字段沒有任何反應,我認為DBI只是忽略了這個價值。

不,它沒有。 但是,當您實際上嘗試添加字符串NOW()時,DB認為您正在提供日期時間或時間戳數據類型。 那當然不行。 不幸的是,DBI找不到你的意思。 它所做的只是改變? 進入它獲得的字符串的轉義(通過$dbh->quote() )版本。

你可以做幾件事:

  1. 以適當的格式提供當前時間戳字符串,而不是字符串NOW()

    如果你有它,你可以像這樣使用DateTime::Format::MySQL

     use DateTime::Format::MySQL; dbUpdate( $id, ( notes => 'This was an update', filesize => '100.505', dateEnd => DateTime::Format::MySQL->format_datetime(DateTime->now), ) ); 

    如果沒有,只需使用DateTimeTime::Piece

      use DateTime; my $now = DateTime->now->datetime; $now =~ y/T/ /; dbUpdate( $id, (notes => 'This was an update', filesize => '100.505', dateEnd => $now)); 
  2. 告訴你的dbUpdate函數尋找NOW()類的東西並做出相應的反應。

    你可以做這樣的事情。 但是有更好的方法可以對此進行編碼。 您還應該考慮例如CURRENT_TIMESTAMP()

     sub dbUpdate { my $id = shift; my %val_hash = @_; my $table = 'backupjobs'; my $update_stmt = "UPDATE $table SET "; # Check for the NOW() value # This could be done with others too foreach ( keys %val_hash ) { if ($val_hash{$_} =~ m/^NOW\\(\\)$/i) { $update_stmt .= "$_ = NOW()"; $update_stmt .= ', ' if scalar keys %val_hash > 1; delete $val_hash{$_}; } } # Put everything together, join keeps track of the trailing comma $update_stmt .= join(', ', map { "$_=?" } keys %val_hash ); $update_stmt .= " WHERE ID = ?"; say "update_stmt is : $update_stmt"; say "values are: ", join(', ', values %val_hash); my $dbo = dbConnect(); my $sth = $dbo->prepare( $update_stmt ); $sth->execute( values %val_hash, $id ) or die "DB Update failed : $!\\n"; $dbo->disconnect || die "Failed to disconnect\\n"; return 1; } 
  3. 自己寫你的問題。

    你可能不會這樣做,我不會添加一個例子,因為你知道怎么做。


這是另一回事:這是您在程序運行時對數據庫執行的唯一操作嗎? 每次進行查詢時連接和斷開數據庫都是不明智的。 一旦你需要它(或者在程序開始時,如果你總是使用它),那么連接數據庫的性能會更好,只需在任何地方使用這個dbh / dbo。 它節省了大量的時間(和代碼)。

抱歉,你不能使用NOW()作為這樣的插值。

什么時候? 在SQL語句中使用,相應的值是(通過某種機制或其他)傳遞給數據庫的轉義,因此無論什么值被解釋為字符串,而不是SQL。 所以你實際上試圖使用字符串'NOW()'作為日期值,而不是函數NOW()

要將NOW()用作函數,您必須將其插入SQL本身,而不是將其作為綁定值傳遞。 這意味着您將不得不使用dbupdate函數的hack或編寫新函數,或者在perl中將時間作為字符串獲取並將結果字符串傳遞給dbupdate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM