2011-07-28 6 views
0

私はDBIx ::クラスを使用していますし、sqlt_deploy_hookを使用していた:DBIx :: Classを使用する際に、どのようにインデックスの長さを指定しますか?

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

私はインデックスを作成する列の一部は、text型である、または> 255の長さのvarcharです。あなたはこのように、長さでそれらを指定しない限り MySQLはテキストインデックスを好きではない:

index (long_field(996)) 

しかし、SQLを見て::翻訳::スキーマ::表(ADD_INDEX方法を持っている)とインデックス、I長さを指定する方法はありません。

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列が本当に必要です。

どうすればよいですか?

+0

問題は、DBICDHが使用するSQL :: Translatorが、より正確なSQLを生成するためにmysqlバージョンを知る必要があることです。 DeploymentHandlerのコンストラクタには次のものが含まれます: "sql_translator_args => {mysql_version => '5.0.3'}" –

答えて

1

申し訳ありませんが、長さを持つインデックス宣言を作成する方法がわかりません。つまり、DBIC deployとDBICDHはSQLTを使用して作業するため、これを実行できません。あなたがirc.perl.org #sql-translatorに来て、この機能がどのように機能し、どのようなインターフェースになるかを議論したい場合、追加されるかもしれませんが、現時点では不可能です。

DBICDHが「長いvarcharsをテキスト列に変換する」というアサーションに関しては、それには非常に間違ったことがあります。それはDBICDHにとって望ましい動作ではありません。その問題に関する新しい質問を投稿したり、あなたがやっていることを示したり、irc.perl.org #dbix-classに持ってきてください。

関連する問題