[英]Perl DBIx::Class - Is it possible to provide a default value for inserting by using column attributes
我有一个(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列属性来实现这一点。 我是误解了此属性的工作原理,还是只是错误地实现了它?
您必须更好地阅读文档。
在L<DBIx::Class::ResultSource/add_columns>
查找default_value
,您会发现
default_value
将此设置为默认值,该默认值将由数据库插入到列中。 可以包含值或函数(如果需要函数,请使用对标量的引用,例如\\'now()')。 当前仅用于从您的模式创建表,请参见DBIx :: Class :: Schema中的“部署”。
因此,如果您不通过DBIC使用部署,则想将DEFAULT uuid()
添加到对应列的SQL模式中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.