1

DBIx::Classを使用していますが、テーブル内の 1 行のみを更新したいと考えています。現在、これは私がそれを行う方法です:

my $session = my_app->model("DB::Session")->find(1);    
$session->update({done_yn=>'y',end_time=>\'NOW()'});

それは機能しますが、問題は、行を見つけるために見つかったときに、次のクエリ全体を実行することです。

SELECT me.id, me.project_id, me.user_id, me.start_time, me.end_time, me.notes, me.done_yn FROM sessions me WHERE ( me.id = ? ): '8'

私がしたいのは行を更新することだけである場合、これは少し多すぎるようです。最初にデータベースから行全体を引き出すことなく、行を更新する方法はありますか? このようなものは、私が探しているものです:

my_app->model("DB::Session")->update({done_yn=>'y',end_time=>\'NOW()'},{id=>$id});

クエリ$idの一部はどこにありますか。WHERE id=?誰もこれを行う方法を知っていますか? ありがとう!

4

3 に答える 3

2

この単一の行のみに一致する制限された結果セットで更新を実行できます。

my_app->model("DB::Session")->search_rs({ id=> 1 })->update({done_yn=>'y',end_time=>\'NOW()'});

end_time 列を更新するには、リテラル SQL の代わりに DateTime->now オブジェクトを使用することをお勧めします。これは、データベース サーバーの代わりにアプリケーション サーバーの日付と時刻を使用し、スキーマをさまざまな RDBMS との互換性を高めるためです。

于 2012-08-14T23:11:00.437 に答える
1

行が見つからなかった場合にエラーを防ぐために、行が見つかったかどうかを確認していますか?

代わりにupdate_or_createを使用することをお勧めします。

于 2012-08-14T07:45:45.647 に答える
0

「列」属性を使用できます。

my $session = my_app->model("DB::Session")->find(1, {columns => "id"});
于 2012-08-14T04:01:46.063 に答える