2011-07-28 35 views
0

我使用DBIx ::類和現在用的sqlt_deploy_hook到:如何在使用DBIx :: Class時指定索引長度?

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

一些我想要索引列的類型的文本,或者是VARCHAR處理> 255的長度。 MySQL不喜歡的文本索引,除非你有一個長度指定它們,就像這樣:

index (long_field(996)) 

但看SQL ::譯者::模式::表(具有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,當我「安裝」時,它將我的長變體轉換爲文本列,而且我真的需要那些索引的varchar列。

我該怎麼辦?

+0

問題是SQL :: Translator,DBICDH使用,需要知道一個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是「將我的長變量轉換爲文本列」,那裏有一些非常錯誤的東西;對於DBICDH來說這不是期望的行爲。請發佈有關該問題的新問題,顯示您正在做什麼,或將其帶到irc.perl.org #dbix-class

相關問題