繁体   English   中英

Perl DBIx :: Class-是否可以通过使用列属性为插入提供默认值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM