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

Yuv*_*rmi 10 ruby regex sql sqlite ruby-on-rails

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

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

但是,在SQLite3下运行时,我会继续:

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

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

gem 'sqlite3'
Run Code Online (Sandbox Code Playgroud)

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

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000
Run Code Online (Sandbox Code Playgroud)

有什么想法发生了什么?

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

Aar*_*gne 15

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

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


mu *_*ort 7

精细手册:

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

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

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

我猜你可能要用LIKE和GLOB来做.使用LIKE将提供更便携的解决方案.