2011-07-27 9 views
8

私はSQLite3のデータベースを使用して、レール3の次のステートメントを持っている:SQLite3とRails 3.1でREGEXPを有効にする方法は?

SQLite3のを::のSQLException:いいえ、そのような機能:REGEXP SQLite3の下にこれを実行するとき

word = 'Hello' 
word_entry = Word.where("name REGEXP :word", {:word => "[[:<:]]#{word}[[:>:]]"}) 

はしかし、私は入れません

実際にREGEXP機能をサポートしていることをSQLite3のドキュメントで読みました。何が起こっているのか

development: 
    adapter: sqlite3 
    database: db/development.sqlite3 
    pool: 5 
    timeout: 5000 

任意のアイデア:私のgemfileで は、私はライン

gem 'sqlite3' 

そして、私のデータベースの設定ファイルは次のようになりますか?

解決: this solutionが見つかりました。残念ながら、それはRails 3では機能しません。 正規表現を使用するために、SQLite3ではなくMYSQLに切り替えることになりました。 fine manualから

答えて

13

同じ問題が発生しました。私は解決に使用されたコードを取って、Rails 3 +で動作するように移植し、より使いやすくするために宝石を作りました。私はこれが役立つことを願っています

https://github.com/sei-mi/sqlite3_ar_regexp

+0

そしてそのために、あなたはブラウニーポイントを得ます(あなたの答えは正しいものとしてマークされています)。ありがとう、ありがとう、ありがとう! –

7

REGEXP演算子は、正規表現()ユーザ機能のための特別な構文です。 regexp()ユーザー関数はデフォルトでは定義されていないため、REGEXP演算子を使用すると通常はエラーメッセージが表示されます。実行時に "regexp"という名前のアプリケーション定義のSQL関数が追加された場合、その関数はREGEXP演算子を実装するために呼び出されます。

したがって、文法はREGEXPをサポートしていますが、デフォルトのSQLiteライブラリはその実装を提供していません。そのようなことが必要な場合や必要がある場合は、Cの論争を通じて独自の実装をフックアップする必要があります。

おそらく根拠は、SQLiteの人々は小さく、タイトな可能性としてではなく、全体の正規表現ライブラリは、ほとんどの人が望んでいないという重量を追加するなどのようSQLiteのを維持したいということです。また、正規表現ライブラリを選択してSQLiteソースに含める必要があります。そうしないと、libcの全員の正規表現サポートのバグを修正する必要があります。私はSQLite開発者の一人ではないので、これは純粋な推測です。

私は、あなたはおそらくLIKE and GLOBで間に合わせなければならないことを推測しています。 LIKEを使用すると、よりポータブルなソリューションが提供されます。

+0

は私の問題を解決するのに十分な本当に固有のものではないが、それは私の質問に正しい答えです。私の質問で 'RESOLUTION'という編集を見てください。 –

+1

@yuval:それはかなり良い発見です、それはもう働きません。 –

2

私は同様の質問があったが、十分に文書化し、箱から出して働いているwherexという名前の宝石を発見しました。

上記
Word.where("name REGEXP :word", {:word => "[[:<:]]#{word}[[:>:]]"}) 

からあなたの表現は、あなたがREGEXPを実装sqlite3-pcreパッケージでintestedすることができる

2

:-)私にとっては魔法のように

Word.where(:name => Regexp.new("[[:<:]]#{word}[[:>:]]")) 

作品が存在することになりますSQLiteのために。

this commentを参照してください。 sqlite3_ar_regexpプロジェクトのソースから

0

は、私はこれを抽出します。

db = SQLite3::Database.open(database_name) 
db.create_function('regexp', 2) do |func, pattern, expression| 
    func.result = expression.to_s.match(
     Regexp.new(pattern.to_s, Regexp::IGNORECASE)) ? 1 : 0 
end 
関連する問題