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

Posted

技术标签:

【中文标题】使用 DBIx::Class 时如何指定索引长度?【英文标题】:How do you specify index length when using DBIx::Class? 【发布时间】:2011-07-28 13:44:33 【问题描述】:

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

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

我要索引的某些列是文本类型,或者是长度大于 255 的 varchars。 mysql 不喜欢文本索引,除非您指定它们的长度,如下所示:

index (long_field(996))

但是查看 SQL::Translator::Schema::Table(它有 add_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,它在我“安装”时将我的长 varchars 转换为文本列,我真的需要索引这些 varchar 列。

我能做什么?

【问题讨论】:

问题是 DBICDH 使用的 SQL::Translator 需要知道一个 mysql 版本才能生成更准确的 sql(IE 不会过多地破坏你的列类型)。在 DeploymentHandler 的构造函数中包括:“sql_translator_args => mysql_version => '5.0.3' ” 【参考方案1】:

对不起,SQL::Translator 根本不了解如何生成带长度的索引声明,这意味着 DBIC deploy 和 DBICDH 也不能这样做,因为它们通过 SQLT 完成工作。如果您想访问 irc.perl.org #sql-translator 并讨论此功能将如何工作以及界面将是什么,可能会添加它,但目前不可能。

至于您断言 DBICDH 正在“将我的长 varchars 转换为文本列”,这是非常错误的;这不是 DBICDH 所期望的行为。请发布一个关于该问题的新问题,说明您在做什么,或将其提交给 irc.perl.org #dbix-class

【讨论】:

以上是关于使用 DBIx::Class 时如何指定索引长度?的主要内容,如果未能解决你的问题,请参考以下文章

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

Perl / DBIx :: Class :: Schema :: Loader后缀_2以复制关系名称

Perl DBIx::Class - 是不是可以使用列属性为插入提供默认值

DBIx :: Class和重载访问器

数据库索引

Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?