簡體   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