Perl DBIx::Class - 是不是可以使用列属性为插入提供默认值
Posted
技术标签:
【中文标题】Perl DBIx::Class - 是不是可以使用列属性为插入提供默认值【英文标题】:Perl DBIx::Class - Is it possible to provide a default value for inserting by using column attributesPerl DBIx::Class - 是否可以使用列属性为插入提供默认值 【发布时间】: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 线程:***.com/questions/270309/… 【参考方案1】:你必须更好地阅读文档。
查看L<DBIx::Class::ResultSource/add_columns>
的default_value
你会发现
default_value
将此设置为默认值,该值将通过以下方式插入列中 数据库。可以包含值或函数(使用 对标量的引用,例如\'now()' 如果你想要一个函数)。这是 目前仅用于从您的架构创建表,请参阅“部署” DBIx::Class::Schema。
因此,如果您不使用通过 DBIC 进行部署,您宁愿将 DEFAULT uuid()
添加到相应列的 SQL 架构中。
【讨论】:
谢谢。我显然浏览了“当前仅用于从您的架构创建表”这句话,而没有让它的含义深入人心。以上是关于Perl DBIx::Class - 是不是可以使用列属性为插入提供默认值的主要内容,如果未能解决你的问题,请参考以下文章
Perl / DBIx :: Class :: Schema :: Loader后缀_2以复制关系名称