【问题标题】:Rails and Heroku - Rake db:seed only populates some databases and not others?Rails 和 Heroku - Rake db:seed 只填充一些数据库而不填充其他数据库?
【发布时间】:2016-09-01 12:44:29
【问题描述】:

我有一个一直在本地开发并部署到 heroku 的 rails 应用程序。我有很多需要播种的数据,这些数据在本地运行良好,还有一个我不太在意的小问题。基本上我有很多表涵盖:

  • 功能,
  • 插件,
  • 预算,
  • 项目类型
  • 工业

等等。

当我创建/重置本地数据库并运行 rake db:seed 时,它会完美地播种到每个数据库。

但是,作为一个 WIP,我不断添加新表并运行种子 rake db:seed,并注意到它应该将所有种子数据加倍(因为我从未清除数据),它实际上只是在插件和功能表上复制了此信息。其他表没有变化。我什么都没想,直到我开始尝试运行 heroku run rake db:seed 来填充我的生产数据库并注意到在日志中它也只填充了 Addon 和 Feature 表,并跳过了其余部分。

我的一些种子文件的摘录(我用 ... 缩写,因为它们非常重复但都一样):

#Populate the features table
Feature.destroy_all

Feature.create(id: 1, name: 'Contact form')
Feature.create(id: 2, name: 'Blog')
Feature.create(id: 3, name: 'Mailing list signup')
...
...

#Populate the addons table
Addon.destroy_all

Addon.create(id: 1, name: 'Domain registration')
Addon.create(id: 2, name: 'Hosting')
Addon.create(id: 3, name: 'Create content')
...
...

#Populating the industries table
Industry.destroy_all

Industry.create(id: 1, name: 'Accounting')
Industry.create(id: 2, name: 'Airlines')
Industry.create(id: 3, name: 'Alternative Medicine')
...
...

# Populating the budgets table
Budget.destroy_all

Budget.create(id: 1, name: 'Micro', minimum: 250, maximum: 1000)
Budget.create(id: 2, name: 'Simple', minimum: 1000, maximum: 2500)
...
...

我注意到,当我尝试使用 heroku run rake db:seed 填充 heroku 数据库时,所有数据似乎都“回滚”了。以下是控制台的摘录:

首先我运行heroku run rake db:migrate

    D, [2016-09-01T12:24:31.463009 #3] DEBUG -- :    (1.8ms)  SELECT pg_try_advisory_lock(4467995963834188590);
    D, [2016-09-01T12:24:31.476939 #3] DEBUG -- :   ActiveRecord::SchemaMigration Load (1.9ms)  SELECT "schema_migrations".* FROM "schema_migrations"
    D, [2016-09-01T12:24:31.507280 #3] DEBUG -- :   ActiveRecord::InternalMetadata Load (1.8ms)  SELECT  "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2  [["key", :environment], ["LIMIT", 1]]
    D, [2016-09-01T12:24:31.518500 #3] DEBUG -- :    (1.7ms)  BEGIN
    D, [2016-09-01T12:24:31.522494 #3] DEBUG -- :    (1.7ms)  COMMIT
    D, [2016-09-01T12:24:31.524504 #3] DEBUG -- :    (1.8ms)  SELECT pg_advisory_unlock(4467995963834188590)

然后我运行 rake heroku run rake db:seed

对于不起作用的表,它似乎这样做:

D, [2016-09-01T12:27:28.229540 #3] DEBUG -- :   ActiveRecord::SchemaMigration Load (2.2ms)  SELECT "schema_migrations".* FROM "schema_migrations"
D, [2016-09-01T12:27:28.261528 #3] DEBUG -- :   Budget Load (2.3ms)  SELECT "budgets".* FROM "budgets"
D, [2016-09-01T12:27:28.293954 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.320090 #3] DEBUG -- :    (1.9ms)  ROLLBACK
D, [2016-09-01T12:27:28.322421 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.325418 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.327617 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.331031 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.333423 #3] DEBUG -- :    (1.8ms)  BEGIN
D, [2016-09-01T12:27:28.338379 #3] DEBUG -- :    (2.5ms)  ROLLBACK
D, [2016-09-01T12:27:28.340601 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.344061 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.346208 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.349342 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.353205 #3] DEBUG -- :    (3.4ms)  BEGIN
D, [2016-09-01T12:27:28.358254 #3] DEBUG -- :    (2.5ms)  ROLLBACK
D, [2016-09-01T12:27:28.360392 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.363406 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.365488 #3] DEBUG -- :    (1.6ms)  BEGIN
D, [2016-09-01T12:27:28.367862 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.369869 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.372657 #3] DEBUG -- :    (1.8ms)  ROLLBACK
D, [2016-09-01T12:27:28.378093 #3] DEBUG -- :   Industry Load (2.1ms)  SELECT "industries".* FROM "industries"
D, [2016-09-01T12:27:28.393455 #3] DEBUG -- :    (1.8ms)  BEGIN
D, [2016-09-01T12:27:28.409125 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.411280 #3] DEBUG -- :    (1.6ms)  BEGIN
D, [2016-09-01T12:27:28.414223 #3] DEBUG -- :    (1.6ms)  ROLLBACK
D, [2016-09-01T12:27:28.416244 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.419335 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.421511 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.425412 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.427570 #3] DEBUG -- :    (1.7ms)  BEGIN
D, [2016-09-01T12:27:28.431136 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.433536 #3] DEBUG -- :    (2.0ms)  BEGIN
D, [2016-09-01T12:27:28.438208 #3] DEBUG -- :    (1.7ms)  ROLLBACK
D, [2016-09-01T12:27:28.440437 #3] DEBUG -- :    (1.7ms)  BEGIN

然后当它通过功能和插件时,它似乎工作正常:

D, [2016-09-01T12:27:29.506570 #3] DEBUG -- :   SQL (1.9ms)  INSERT INTO "features" ("id", "name", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["id", 1], ["name", "Contact form"], ["created_at", 2016-09-01 12:27:29 UTC], ["updated_at", 2016-09-01 12:27:29 UTC]]
D, [2016-09-01T12:27:29.509515 #3] DEBUG -- :    (2.5ms)  COMMIT
D, [2016-09-01T12:27:29.512944 #3] DEBUG -- :    (2.2ms)  BEGIN
D, [2016-09-01T12:27:29.516551 #3] DEBUG -- :   SQL (1.9ms)  INSERT INTO "features" ("id", "name", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["id", 2], ["name", "Blog"], ["created_at", 2016-09-01 12:27:29 UTC], ["updated_at", 2016-09-01 12:27:29 UTC]]
D, [2016-09-01T12:27:29.519489 #3] DEBUG -- :    (2.5ms)  COMMIT
D, [2016-09-01T12:27:29.522216 #3] DEBUG -- :    (2.5ms)  BEGIN
D, [2016-09-01T12:27:29.526125 #3] DEBUG -- :   SQL (1.9ms)  INSERT INTO "features" ("id", "name", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["id", 3], ["name", "Mailing list signup"], ["created_at", 2016-09-01 12:27:29 UTC], ["updated_at", 2016-09-01 12:27:29 UTC]]

我确实注意到,在这些表中,插件和功能都与其他表具有 has_and_belongs_to_many 关联,而其余不工作的表与其他一些表具有 belongs_to 关联。不知道这是否只是巧合?感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails postgresql heroku seed


    【解决方案1】:

    好吧,据我所知,这似乎是 belongs_to 模型的种子数据库的问题。我通过以下方式解决了这个问题:

    进入每个模型和#'ing belongs_to 关系。然后我反驳说:

    git add .
    git commit -m "hashed belongs_to associations"
    git push
    git push heroku master
    heroku run rake db:seed
    

    当我检查数据库时,它现在似乎很完美。我现在将取消关系,重新 git 并重新推送到 heroku。

    【讨论】:

    • 我遇到了同样的问题,并且莫名其妙地注释掉了 belongs_to 关系。这是一个错误,不是吗?
    【解决方案2】:

    您为什么不尝试使用 find_or_create_by!该方法将首先检查记录是否存在,如果不存在则仅创建。:

    Feature.find_or_create_by!(name: 'Contact form')
    

    当您在方法末尾使用 bang 符号时,它还会进行验证。您也不必在此处提及 id。当您提供 ID 时,这可能会给您带来问题。

    如果您仍然遇到任何问题,请告诉我。

    【讨论】:

    • 这似乎解决了症状而根本没有解决根本问题。
    • 谢谢,我试过了,还是不行。似乎是 belongs_to 关系的问题。将我的工作发布为上面的答案。
    • 我可以知道您使用的是哪个版本的 Rails 吗?
    【解决方案3】:

    从 Rails 5.1 开始,belongs_to 关联对象是默认需要的(参见https://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html)。也许你的种子模型的一些belongs_to-associations 不存在,这就是为什么heroku 不会为模型种子,因为存在验证失败。

    一个简单的解决方案是将关联标记为可选:

    class Budget 
       belongs_to :feature, optional: true
       ....
    end
    

    【讨论】:

      猜你喜欢
      • 2013-02-28
      • 2013-01-17
      • 2010-12-31
      • 2011-09-15
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多