1

我正在使用DBIx::Class,我只想更新表中的一行。目前我是这样做的:

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()'});

我建议您使用 DateTime->now 对象而不是文字 SQL 来更新 end_time 列,因为它使用应用程序服务器日期和时间而不是数据库服务器,并使您的架构与不同的 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 回答