【问题标题】:SQLite3::SQLException: no such function: REGEXP rails rspecSQLite3::SQLException:没有这样的功能:REGEXP rails rspec
【发布时间】:2017-02-22 18:06:33
【问题描述】:

在我的项目中,我有不同的时间片。这些时间片具有诸如“00-04”、“04-08”、“08-12”、“12-16”、“16-20”和“20-24”等名称。我想获得所有具有上述名称的时间片对象。所以,我编写了以下程序:

time_slice_names = ["00-04", "04-08", "08-12", "12-16", "16-20", "20-24"]
time_slices = TimeSlice.where('name REGEXP ?', time_slice_names.join("|"))

time_slices 在我的开发模式中为我提供了正确的对象。但是,当我运行测试时,出现以下错误:

 ActiveRecord::StatementInvalid:
 SQLite3::SQLException: no such function: REGEXP: SELECT "time_slices".* FROM "time_slices"  WHERE (name REGEXP '00-04|04-08|08-12|12-16|16-20|20-24')

我的database.yml如下:

  development:
    adapter: mysql2
    database: development 
    encoding: utf8
    pool: 5
    timeout: 5000

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

我知道我的测试环境使用 sqlite3 而我的开发环境使用 mysql2。无论如何,我可以在 mysql2 和 sqlite3 上执行上述查询吗?

【问题讨论】:

  • 我发现对 dev/test/prod 使用相同的 DB 适配器会更好。但是,请检查this(忽略已接受的答案)。
  • @sadiksha 我也对 SQLite 部分了解不多。因此,如果它适用于 MySQL 而不是 SQLite,则错误清楚地表明 SQLite 没有实现该 regexp 函数。所以最好按照 ndn 的建议对所有环境使用相同的 Db。
  • 谢谢你和@ndn,在这种情况下,我使用查询来处理数组。我一定会考虑你的建议。
  • @SadikshaGautam 最好使用当前解决方案发布答案​​并接受它以供未来用户查找。

标签: regex ruby-on-rails-4 rspec sqlite ruby-2.1


【解决方案1】:

所以根据How to turn on REGEXP in SQLite3 and Rails 3.1?中的不同答案,Sqlite3中默认没有定义regexp()。您必须安装一个本机扩展,将这个功能添加到 Sqlite3。

但是,您的查询可以在不使用正则表达式的情况下完成。

time_slice_names = ["00-04", "04-08", "08-12", "12-16", "16-20", "20-24"]
time_slices = TimeSlice.where(name: time_slice_names)

内部数据库适配器(mysql 或 sqlite3)应该理解这一点并将其转换为支持where field in (x, y, z) 查询。

更多信息ActiveRecord where field = ? array of possible values

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2016-01-19
    • 2022-08-15
    • 2015-10-08
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多