Mysql DBIx::类只更新一行

Mysql DBIx::类只更新一行,mysql,catalyst,dbix-class,Mysql,Catalyst,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

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

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
是查询的
其中id=?
部分。有人知道怎么做吗?谢谢

您可以使用“列”属性:

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

您是否检查该行是否已找到,以防止在未找到的情况下发生错误


您可能想改用。

您可以在仅与这一行匹配的受限结果集上运行更新:

my\u app->model(“DB::Session”)->search\r({id=>1})->update({done\u yn=>'y',end\u time=>\'NOW()})


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

通常,允许
find()
检索您希望更新的列,除了主键外,还启用
update()
,以便在不需要时(即新数据与现有数据相同)不发出update语句。当然,这与您的情况无关。但是这如何使它成为一个查询呢?在那之后,我是否还必须对我找到的行运行更新?抱歉,我误解了你的问题。这很好,因为它在一行中完成,但这真的是两个sql语句,因为它必须首先找到结果集?搜索(\u rs)仅限制结果集定义,在调用all或next或在列表上下文中使用它之前,不会生成或运行SQL。我知道这很晚了,但这实际上对我来说是可行的。谢谢