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以复制关系名称

使用 DBIx::Class 时如何指定索引长度?

DBIx::Class::Schema::Loader: make_schema_at 没有找到任何关系

DBIx :: Class和重载访问器

如何让 Perl 检测错误的 UTF-8 序列?

Visual Studio Professional 是不是支持 Perl?