Развертывание приложения Rails в Heroku: ОШИБКА: отношение "todo_lists" не существует - PullRequest
0 голосов
/ 12 июля 2020

Я застрял на этой проблеме несколько дней. Не могли бы вы дать какое-нибудь руководство, чтобы исправить это и развернуть базу данных на Heroku?

Вот часть моего schema.rb:

  create_table "todo_items", force: :cascade do |t|
    t.string "title"
    t.bigint "user_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.boolean "completed", default: false
    t.datetime "completed_at"
    t.bigint "todo_id", null: false
    t.index ["todo_id"], name: "index_todo_items_on_todo_id"
    t.index ["user_id"], name: "index_todo_items_on_user_id"
  end

  create_table "todos", force: :cascade do |t|
    t.string "title"
    t.bigint "user_id", null: false
    t.bigint "project_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["project_id"], name: "index_todos_on_project_id"
    t.index ["user_id"], name: "index_todos_on_user_id"
  end

Я пытаюсь развернуть новый Rails 6 приложение к Heroku и сделали следующее:

  • heroku login
  • heroku create app
  • heroku addons:create heroku-postgresql:hobby-dev
  • git push heroku master
  • heroku run rails db:migrate

Когда я запускаю последнюю команду heroku run rails db:migrate, я получаю следующие сообщения об ошибках:

ПРИМЕЧАНИЕ. Я создал неправильную ссылку todo_list и таблица в какой-то момент, а затем их удалили, поэтому todo_lists вообще не существует в моей схеме.

Сообщение об ошибке # 1

StandardError: An error has occurred, this and all later migrations canceled:
    
PG::UndefinedTable: ERROR:  relation "todo_lists" does not exist
...
/app/db/migrate/20200606053040_create_todo_items.rb:3:in `change'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:212:in `transaction'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1361:in `ddl_transaction'
...
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:212:in `transaction'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1361:in `ddl_transaction'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1309:in `execute_migration_in_transaction'

Сообщение об ошибке # 2

Caused by:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "todo_lists" does not exist
...
/app/db/migrate/20200606053040_create_todo_items.rb:3:in `change'
...
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1002:in `migrate'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1310:in `block in execute_migration_in_transaction'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1361:in `block in ddl_transaction'
...
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:212:in `transaction'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1361:in `ddl_transaction'

Сообщение об ошибке # 3

Caused by:
PG::UndefinedTable: ERROR:  relation "todo_lists" does not exist
...
/app/db/migrate/20200606053040_create_todo_items.rb:3:in `change'
...
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1002:in `migrate'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1310:in `block in execute_migration_in_transaction'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1361:in `block in ddl_transaction'
...
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:280:in `transaction'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:212:in `transaction'
/app/vendor/bundle/ruby/2.7.0/gems/activerecord-6.0.3.2/lib/active_record/migration.rb:1361:in `ddl_transaction'

Вот часть моих миграций (rails db:migrate:status):

   up     20200604053157  Create todos
   up     20200606053040  Create todo items
   up     20200606235328  Add completed to todo items
   up     20200606235537  Add completed at to todo items
   up     20200608050430  Remove todo list id from todo items
   up     20200608050957  Drop todo list
   up     20200608051132  Add todo id to todo items

20200606053040_create_todo_items.rb

class CreateTodoItems < ActiveRecord::Migration[6.0]
  def change
    create_table :todo_items do |t|
      t.string :title
      t.references :user, null: false, foreign_key: true
      t.references :todo_list, null: false, foreign_key: true

      t.timestamps
    end
  end
end

20200608050430_remove_todo_list_id_from_todo_items.rb

class RemoveTodoListIdFromTodoItems < ActiveRecord::Migration[6.0]
  def change
    safety_assured { remove_reference :todo_items, :todo_list, null: false, foreign_key: true }
  end
end
* 1057_ 20200608050957_todo_do32 * 1057_ 20200608050957_drop_do32 * 1057_20200608050957_drop_dodd * 1058_drop_todo_list * 1058_drop_todo_list * items.rb
class AddTodoIdToTodoItems < ActiveRecord::Migration[6.0]
  disable_ddl_transaction!

  def change
    add_reference :todo_items, :todo, null: false, index: {algorithm: :concurrently}
  end
end

Ответы [ 3 ]

0 голосов
/ 13 июля 2020

Хорошо, я предполагаю, что следующие успешные миграции происходят в вашей среде разработки:

   up     20200604053157  Create todos
   up     20200606053040  Create todo items
   up     20200606235328  Add completed to todo items
   up     20200606235537  Add completed at to todo items
   up     20200608050430  Remove todo list id from todo items
   up     20200608050957  Drop todo list
   up     20200608051132  Add todo id to todo items

Также вторая миграция делает ссылку на todo_lists:

class CreateTodoItems < ActiveRecord::Migration[6.0]
  def change
    create_table :todo_items do |t|
      t.string :title
      t.references :user, null: false, foreign_key: true
      t.references :todo_list, null: false, foreign_key: true

      t.timestamps
    end
  end
end

Но до этой второй миграции делая ссылку на todo_lists, я вижу только одну миграцию, которая 20200604053157 Create todos, которая, вероятно, ничего не делает с todo_lists

Таким образом, вероятно, была миграция между первой и второй миграциями, которая создавала таблица todo_lists. Но вы, вероятно, удалили этот файл.

Это не проблема в разработке, поскольку этот файл существовал и выполнял создание таблицы todo_lists. Но если вы удалите этот файл и попросите ваше приложение Rails на Heroku сделать ссылку на него, оно больше не сможет этого делать.

И тогда вы получите сообщение об ошибке.

Вы должны никогда не удаляйте файлы миграции. Поскольку вы вносите изменения постепенно (новые таблицы, уничтожение таблиц ...), вам следует оставить все как есть. Или более поздние развертывания (и создание базы данных) больше не могут делать то, что вы их просите.

Теперь, чтобы исправить это: если у вас все еще есть копия исходного файла, просто восстановите ее. В противном случае просто удалите (или отредактируйте) любые миграции, в которых упоминается todo_lists, будь то создание или уничтожение, а затем сбросьте свою базу данных и создайте ее снова. (Кажется, это проект, тогда я думаю, это не имеет большого значения)

На этот раз он не будет знать todo_lists

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

Я удалил все упоминания или ссылки на todo_list или todo_lists из моих файлов миграции и зафиксировал свой код.

Затем выполнил следующее:

heroku run rails db:migrate

0 голосов
/ 12 июля 2020

Я использовал эту команду, и она сработала:

heroku run rake db:migrate.

Я помню похожую проблему и думаю, что это был ответ.

https://devcenter.heroku.com/articles/getting-started-with-ruby?singlepage=true

...