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