如何在SQLite3和Rails3.1中打开REGEXP?

如何在SQLite3和Rails3.1中打开REGEXP?,sql,ruby-on-rails,ruby,regex,sqlite,Sql,Ruby On Rails,Ruby,Regex,Sqlite,我在Rails 3中使用SQLite3数据库有以下语句: word = 'Hello' word_entry = Word.where("name REGEXP :word", {:word => "[[:<:]]#{word}[[:>:]]"}) 我的数据库配置文件如下所示: development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 知道发生了什

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

word = 'Hello'
word_entry = Word.where("name REGEXP :word", {:word => "[[:<:]]#{word}[[:>:]]"})
我的数据库配置文件如下所示:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000
知道发生了什么事吗

分辨率: 我终于找到了。不幸的是,它不适用于Rails3。 因此,为了使用正则表达式,我最终切换到MYSQL而不是SQLite3

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

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

据推测,基本原理是SQLite人员希望保持SQLite尽可能小和紧凑,但包括一个完整的正则表达式库将增加大多数人不希望增加的重量。此外,他们必须选择一个正则表达式库并将其包含在SQLite源代码中,否则他们必须忍受每个人在libc中对正则表达式的支持。我不是SQLite开发人员,所以这纯粹是猜测


我猜你可能得将就一下了。使用LIKE将提供一个更便携的解决方案。

我遇到了同样的问题。我使用了解析中使用的代码,将其移植到Rails 3+上,并制作了一个gem以便于使用。我希望这有帮助


我有一个类似的问题,发现了一个名为Gem的宝石,它有很好的文档记录,而且是开箱即用的

从上面看你的表情

Word.where("name REGEXP :word", {:word => "[[:<:]]#{word}[[:>:]]"})
Word.where(“name REGEXP:Word”,{:Word=>“[[::]]”
会有吗

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

对我来说就像一个魔咒:-)

您可能会被集成到
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

从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
db=ActiveRecord::Base.connection.raw\u连接
db.create_函数('regexp',2)do|func,模式,表达式|
func.result=expression.to_.match(
Regexp.new(pattern.tos,Regexp::IGNORECASE))?1 : 0
结束

改进了前面的回答,使用了
ActiveRecord::Base.connection.raw_connection
,因此不需要db名称

并没有足够具体地解决我的问题,但这是我问题的正确答案。请看我题为
RESOLUTION
@yuval的问题中的编辑:这是一个非常好的发现,可惜它已经不起作用了。为此,你会得到布朗尼分数(并且你的答案被标记为正确答案)。谢谢谢谢谢谢!!