如何在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。 我希望这有帮助。
从精细手册 :
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