我有一个(MySQL)表, import ,定义为:
CREATE TABLE `import` (
`importId` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL,
`stuff` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`importId`),
KEY `stuff` (`stuff`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我使用DBIx::Class::Schema::Loader->make_schema_at
生成我的DBIx :: Class架构。
我希望能够发出$schema->resultset('Import')->create({});
(即,不提供主键)并自动填充importId字段,调用MySQL uuid()
函数的结果。为了尝试这样做,我在 Schema / Result / Import.pm 的底部添加了以下内容:
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:cKY/6hdjrNaMgdhm6SlzoQ
use Data::Dumper;
print Dumper __PACKAGE__->columns_info();
__PACKAGE__->add_columns(
'+importId' =>
{
default_value => \'uuid()', #'
},
);
print Dumper __PACKAGE__->columns_info();
数据转储显示default_value属性已按预期添加到importId:
$VAR1 = {
'importId' => {
'data_type' => 'varchar',
'default_value' => \'uuid()', #'
'is_nullable' => 0,
'size' => 36,
'accessor' => 'import_id'
},
'stuff' => {
'data_type' => 'varchar',
'is_nullable' => 1,
'size' => 12
}
};
但如果我在create()
调用中没有为importId提供值,则DBIx :: Class仍会发出INSERT INTO import () VALUES ()
。
我通过在 Schema / Result / Import.pm 的末尾放置以下内容来修改insert()
方法,从而实现了我想要的目标:
use Moo;
before 'insert' => sub
{
my $self = $_[0];
my $column_data = $self->{_column_data};
$column_data->{importId} = \'uuid()' #'
unless exists $column_data->{importId} && defined $column_data->{importId};
};
我以为我应该能够使用default_value列属性来实现这一点。我误解了这个属性是如何工作的,还是我错误地实现了它?
答案 0 :(得分:1)
你必须更好地阅读文档。
查看L<DBIx::Class::ResultSource/add_columns>
default_value
,您会发现
default_value
将此值设置为默认值,该值将插入到列中 数据库。可以包含值或函数(使用a 参考例如标量\&#39;现在()&#39;如果你想要一个功能)。这是 目前仅用于从架构中创建表,请参阅&#34; deploy&#34;在 DBIx ::类::架构。
因此,如果您不通过DBIC使用部署,则需要将DEFAULT uuid()
添加到相应列的SQL架构中。