使用 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以复制关系名称