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

时间:2014-06-12 10:40:03

标签: perl default-value dbix-class

我有一个(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列属性来实现这一点。我误解了这个属性是如何工作的,还是我错误地实现了它?

1 个答案:

答案 0 :(得分:1)

你必须更好地阅读文档。

查看L<DBIx::Class::ResultSource/add_columns> default_value,您会发现

default_value
     

将此值设置为默认值,该值将插入到列中   数据库。可以包含值或函数(使用a   参考例如标量\&#39;现在()&#39;如果你想要一个功能)。这是   目前仅用于从架构中创建表,请参阅&#34; deploy&#34;在   DBIx ::类::架构。

因此,如果您不通过DBIC使用部署,则需要将DEFAULT uuid()添加到相应列的SQL架构中。