【发布时间】:2014-06-12 10:40:02
【问题描述】:
我有一个(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({});(即不提供主键)并使用调用 MySQL 的uuid() 函数的结果自动填充 importId 字段。为了尝试这样做,我在 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 列属性来实现这一点。我误解了这个属性是如何工作的,还是我没有正确地实现它?
【问题讨论】:
-
主键是数据库级别的构造,而不是应用程序级别的构造,因此您可能需要考虑在数据库级别执行此 SO 线程:stackoverflow.com/questions/270309/…
标签: perl default-value dbix-class