如何在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
相关产品推荐
相关产品推荐

