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

问题描述 投票:0回答:2

我正在使用 DBIx::Class 并使用 sqlt_deploy_hook 来:

sub {
    my ($self, $sqlt_table) = @_;
    $sqlt_table->add_index(name => 'indexes', fields => [keys %for_indexing]);
}

我想要索引的一些列是文本类型,或者是 varchars > 255 长度。 MySQL 不喜欢文本索引,除非你指定它们的长度,如下所示:

index (long_field(996))

但是查看 SQL::Translator::Schema::Table (具有 add_index 方法)和 Index,我发现无法指定长度。

add_index(name => 'indexes', fields => ['long_field'])

生成此 SQL:

INDEX `indexes` (`long_field`)

还有这个:

add_index(name => 'indexes', fields => ['long_field(996)'])

生成此 SQL:

INDEX `indexes` (`long_field(996)`)

这不起作用,因为没有具有该名称的列。

到目前为止,我已经通过不为文本列建立索引来解决这个问题。不过,我现在正在尝试使用 DBIx::Class::DeploymentHandler,它在“安装”时将我的长 varchar 转换为文本列,并且我确实需要对这些 varchar 列进行索引。

我能做什么?

perl dbix-class
2个回答
1
投票

抱歉,

SQL::Translator
根本不明白如何生成具有长度的索引声明,这意味着 DBIC
deploy
和 DBICDH 也无法做到这一点,因为它们通过 SQLT 完成工作。如果您想访问 irc.perl.org
#sql-translator
并讨论此功能如何工作以及接口是什么,它可能会被添加,但目前这是不可能的。

至于您断言 DBICDH 正在“将我的长 varchars 转换为文本列”,这是非常错误的;这不是 DBICDH 所期望的行为。请发布关于该问题的新问题,展示您正在做什么,或将其带到 irc.perl.org

#dbix-class


0
投票

这是一个迟到的问题,但最新版本的

SQL::Translator
(1.64)现在对此有直接支持,通过传递由
{ name => $name, prefix_length => $num }
组成的字段的哈希引用(在OP的示例中为
{ name => 'long_field', prefix_length => 996 }
) .

© www.soinside.com 2019 - 2024. All rights reserved.