【问题标题】:Is it possible to use a long id in Rails applications and persist it through to the test database?是否可以在 Rails 应用程序中使用长 id 并将其持久化到测试数据库?
【发布时间】:2015-09-16 16:47:33
【问题描述】:

设置

我们有一些表具有非常高的id 值,因此它们在生产中是bigints,这是通过运行迁移更改包括limit: 8 在内的id 列来实现的。此处概述了此方法:https://stackoverflow.com/a/5870148/2240218

那些迁移不会修改db/schema.rb,所以当我们运行rake db:test:prepare 时,测试数据库是使用具有maximum of 2.1 billion 的普通4 字节整数列创建的(为了它的价值,我们使用的是Postgres) .


关于我们的 ID 的说明

由于遗留原因,它们被绑定为来自第三方系统的外键。理想情况下,我们将使用 id 列作为内部代理主键,而第三方键将完全是一个单独的列(这将消除整个问题),但这种更改的开销超出了我的尝试马上到达。


问题

我正在尝试使用真实世界的数据进行一些集成测试,其中一些的id 大于 21 亿。在运行测试(我们最终将使用 VCR 存根)时,我们将对这些外部系统进行一些调用,因此它们需要是正确的。但是,当我尝试使用这些数据时,它会崩溃,因为该值对于测试数据库中的列来说太大了。

所以我的问题是:在运行db:test:prepare 之后,是否有任何非大规模破解方法来确保这些id 列在测试数据库中为bigints

【问题讨论】:

  • 从 schema.rb 切换到 structure.sql 会修复它吗?
  • 谢谢@PhilipHallstrom - 是的,看起来它可以正常工作!我以前没有遇到过structures.sql,你能把它作为一个例子作为答案,我会接受吗?

标签: ruby-on-rails database postgresql


【解决方案1】:

将架构格式从 :ruby 更改为 :sql,以便您的架构转储是纯 SQL。这应该保持那些大整数完好无损(以及您可能拥有的任何存储过程等)。

在 config/application.rb 中:

config.active_record.schema_format = :sql

http://guides.rubyonrails.org/active_record_migrations.html#types-of-schema-dumps

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多