Как включить REGEXP в SQLite3 и Rails 3.1? - PullRequest
9 голосов
/ 27 июля 2011

У меня есть следующий оператор в Rails 3 с использованием базы данных SQLite3:

word = 'Hello'
word_entry = Word.where("name REGEXP :word", {: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.

Ответы [ 5 ]

14 голосов
/ 11 ноября 2011

Я столкнулся с той же проблемой.Я взял код, использованный в этом разрешении, портировал его для работы с Rails 3+ и сделал гем для более легкого использования.Надеюсь, это поможет.

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

7 голосов
/ 27 июля 2011

Из подробного руководства :

Оператор REGEXP - это специальный синтаксис для пользовательской функции regexp ().По умолчанию пользовательская функция regexp () не определена, поэтому использование оператора REGEXP обычно приводит к сообщению об ошибке.Если определенная приложением функция SQL с именем "regexp" добавляется во время выполнения, эта функция будет вызываться для реализации оператора REGEXP.

Таким образом, грамматика поддерживает REGEXP, но библиотеку SQLite по умолчаниюне обеспечивает реализацию для этого.Вы должны будете подключить свою собственную реализацию посредством некоторого спора на языке C, если вы хотите или нуждаетесь в таком.

Предположительно, обоснование состоит в том, что люди SQLite хотят сохранить SQLite настолько маленьким и жестким, насколько это возможно, но в том числеВся библиотека регулярных выражений добавит вес, который большинство людей не хочет.Кроме того, им придется выбрать библиотеку регулярных выражений и включить ее в исходный код SQLite, или им придется мириться с капризами поддержки регулярных выражений каждого в libc.Я не один из разработчиков SQLite, так что это чистое предположение.

Я предполагаю, что вам, вероятно, придется обойтись с LIKE и GLOB .Использование LIKE обеспечит более портативное решение.

2 голосов
/ 27 декабря 2012

Вы можете быть залиты в пакет sqlite3-pcre, который реализует REGEXP для SQLite.

См. этот комментарий по аналогичной проблеме.

2 голосов
/ 22 декабря 2011

У меня был похожий вопрос, и я нашел Gem с именем , где x , который хорошо документирован и работает из коробки.

Ваше выражение сверху

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

было бы

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

Работает как очарование для меня: -)

0 голосов
/ 16 июля 2015

Из источника проекта 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...