You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DBIx::Class创建记录时获取数据库生成的UUID?

解决DBIx::Class创建记录后获取数据库生成UUID的问题

问题原因

你当前的Schema配置里把id字段标记为is_auto_increment => 1,但DBIx::Class的PK::Auto组件默认只适配整数类型的自增主键,而你的主键是数据库通过UUID()函数生成的字符串类型,这就导致框架错误返回默认的自增初始值0,而非数据库实际生成的UUID。

解决方案

1. 修正Schema中id字段的配置

修改add_columns里的id字段定义,去掉is_auto_increment,添加retrieve_on_insert => 1(告诉DBIx::Class插入后从数据库取回该字段的值),同时明确is_nullable => 0(主键不可为空):

__PACKAGE__->add_columns(
    id => {
        data_type         => 'varchar',
        size              => 36,
        unique            => 1,
        is_nullable       => 0,
        retrieve_on_insert => 1, # 关键配置:插入后自动取回数据库生成的值
    },
    qw/.../ # 其他字段
);

2. 插入时不要传入id值

因为数据库会通过DEFAULT (UUID())自动生成id,调用create时不要在$json里包含id字段,让数据库自行处理主键生成。

3. (可选)手动刷新对象(若自动取回未生效)

如果修改配置后仍未获取到UUID,可以在创建对象后调用discard_changes方法从数据库重新加载数据:

my $log = $self->log_repository->create($json);
$log->discard_changes(); # 从数据库刷新对象的最新数据
print $log->get_column('id'); # 现在会输出正确的UUID

关键说明

  • retrieve_on_insert是DBIx::Class专门用于处理数据库端生成的非自增主键(比如UUID、序列生成值等)的配置,它会在INSERT操作后自动执行SELECT获取该字段的实际值。
  • 无需移除PK::Auto组件,只要正确配置字段属性,框架就能正确处理字符串类型的数据库生成主键。

内容的提问来源于stack exchange,提问作者Rawley Fowler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:15:06