我正在使用 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 列进行索引。
我能做什么?
抱歉,
SQL::Translator
根本不明白如何生成具有长度的索引声明,这意味着 DBIC deploy
和 DBICDH 也无法做到这一点,因为它们通过 SQLT 完成工作。如果您想访问 irc.perl.org #sql-translator
并讨论此功能如何工作以及接口是什么,它可能会被添加,但目前这是不可能的。
至于您断言 DBICDH 正在“将我的长 varchars 转换为文本列”,这是非常错误的;这不是 DBICDH 所期望的行为。请发布关于该问题的新问题,展示您正在做什么,或将其带到 irc.perl.org
#dbix-class
。
这是一个迟到的问题,但最新版本的
SQL::Translator
(1.64)现在对此有直接支持,通过传递由{ name => $name, prefix_length => $num }
组成的字段的哈希引用(在OP的示例中为{ name => 'long_field', prefix_length => 996 }
) .