如何在SQLite3和Rails 3.1中打开REGEXP?

我使用SQLite3数据库在Rails 3中有以下语句:

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

但是,在SQLite3下运行时,我不断得到:

SQLite3 :: SQLException:没有这样的函数:REGEXP

我在SQLite3文档中读到它确实支持REGEXP函数。 在我的gemfile中,我有这条线

 gem 'sqlite3' 

我的数据库配置文件如下所示:

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

有什么想法正在发生什么?

解决方案:我最终找到了这个解决方案 。 不幸的是,它不适用于Rails 3.因此,为了使用正则表达式,我最终切换到MYSQL而不是SQLite3。

我遇到了同样的问题。 我使用了解决方案中使用的代码,移植它以使用Rails 3+并制作了一个更容易使用的gem。 我希望这有帮助。

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

从精细手册 :

REGEXP运算符是regexp()用户函数的特殊语法。 默认情况下没有定义regexp()用户函数,因此使用REGEXP运算符通常会导致错误消息。 如果在运行时添加名为“regexp”的应用程序定义的SQL函数,则将调用该函数以实现REGEXP运算符。

因此语法支持REGEXP,但默认的SQLite库不提供它的实现。 如果你想要或需要这样的东西,你必须通过一些C争论来连接你自己的实现。

据推测,理由是SQLite人希望尽可能地保持SQLite的小而紧,但是包括整个正则表达式库会增加大多数人不想要的权重。 此外,他们必须选择正则表达式库并将其包含在SQLite源中,否则他们必须忍受libc中每个人的正则表达式支持的变幻莫测。 我不是SQLite开发人员之一,所以这是纯粹的推测。

我猜你可能不得不用LIKE和GLOB做。 使用LIKE将提供更便携的解决方案。

我有一个类似的问题,并发现一个名为wherex的Gem,它具有良好的文档记录并且开箱即用。

你从上面的表达

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

会有吗?

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

对我来说就像一个魅力:-)

您可能会使用sqlite3-pcre包,它为SQLite实现了REGEXP

在类似问题上看到此评论 。

从sqlite3_ar_regexp项目的源代码中,我提取了这个:

 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