DBIx :: Class只更新一行

时间:2012-08-13 21:35:23

标签: mysql catalyst dbix-class

我正在使用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=?部分。有谁知道如何做到这一点?谢谢!

3 个答案:

答案 0 :(得分:2)

您可以对仅与此单行匹配的受限制结果集运行更新:

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

我建议您使用DateTime-> now对象而不是文字SQL来更新end_time列,因为它使用应用服务器的日期和时间而不是数据库服务器,并使您的架构与不同的RDBMS更兼容。

答案 1 :(得分:1)

您是否检查过是否发现该行以防止出现错误?

您可能希望改为使用update_or_create

答案 2 :(得分:0)

您可以使用“columns”属性:

my $session = my_app->model("DB::Session")->find(1, {columns => "id"});