【问题标题】:Running an RSpec test suite against a TimescaleDB database with Rails 4.2使用 Rails 4.2 对 TimescaleDB 数据库运行 RSpec 测试套件
【发布时间】:2020-03-27 04:35:37
【问题描述】:

我有一个 Rails 4.2.11.1 应用程序,我正在尝试与 TimescaleDB 数据库一起使用。

我已经解决了大部分问题(使用 composite_primary_keys gem 来绕过 Timescale 的唯一索引应始终包含表的时间戳列的限制)。

这使我的应用程序功能齐全,但每当我尝试写入 Timescale 表时,我的测试套件都会失败,并出现以下错误:

PG::FeatureNotSupported: ERROR:  invalid INSERT on the root table of hypertable "events"
HINT:  Make sure the TimescaleDB extension has been preloaded.

据我所知,Rails 没有在测试数据库中启用扩展;这适用于我正在使用的任何模式转储模式(:sql:ruby)。用bundle exec rails dbconsole手动连接数据库,可以看到扩展开启了。

我不确定这是否是我的代码、Timescale 或 Rails 的错误,但它阻止了我发布此更改。

我希望其他人以前遇到过这种情况并能够提供帮助!

【问题讨论】:

  • 你能看到从 Ruby 到 PostgreSQL 的连接字符串,看看它连接的是哪个数据库?您是否尝试过从另一个工具连接并尝试插入 TimescaleDB 表?你能看到实际的 INSERT 语句吗?您也可以询问 Slack 的 TimescaleDB 社区是否有人解决了您的问题。
  • 您是否创建了一个迁移来启用扩展程序,以便它在schema.rb 中列出?
  • @max 是的,已经完成了。
  • @k_rus 我有一些 INSERT 语句的转储,是的。还有连接字符串。我加入了 TimescaleDB Slack,看看那里有没有人可以提供帮助。
  • @SteveHill 你明白了吗?

标签: ruby-on-rails rspec timescaledb


【解决方案1】:

您确定为您的测试数据库启用了扩展程序吗?

尝试运行: RAILS_ENV=test bundle exec rails dbconsole

如果您编写了一个迁移来启用扩展,我预计它也会针对您的测试数据库运行,除非您专门针对开发运行它。

【讨论】:

  • 是的,我就是这样做的。我也有同样的预期,但这里肯定发生了一些奇怪的事情。
【解决方案2】:

我在 Rails 6.0.2.2 / TimescaleDB 1.7.0(在 Minitest 上)遇到了同样的问题。

当我从 sql 模式转储切换回 ruby​​ 模式转储时,问题已解决。

config.active_record.schema_format = :ruby # (in application.rb)

显然,sql 格式的模式转储包含错误/是部分的,并且从中准备引入了错误 (db:test:clone)。

希望它对您的情况有所帮助。

【讨论】:

  • 不幸的是,我的赞成票已经锁定,否则我会收回。这根本不起作用,它所做的只是schema.rb 中不存在用于创建超表的原始 SQL,因此没有超表,插入它没有问题:(
【解决方案3】:

听起来好像缺少架构转储文件缺少扩展启用命令,

如果config.active_record.schema_format = :rubyschema.rb 将包含enable_extension "timescaledb"

如果config.active_record.schema_format = :sql 那么structure.sql 将包含 CREATE EXTENSION IF NOT EXISTS timescaledb WITH SCHEMA public;

如果您的架构转储中存在这些行,您可能需要对测试数据库架构进行干净还原

# take care with dropping your test db, make sure the database is configured correctly
RAILS_ENV=test rake db:drop
RAILS_ENV=test rake db:create
RAILS_ENV=test rake db:schema:load # RAILS_ENV=test rake db:structure:load if :sql

然后您应该能够运行您的测试,并且将通过上面的架构恢复过程启用扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 2014-08-18
    • 2019-02-21
    • 2020-10-04
    • 2015-06-23
    • 2012-07-28
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多