ActiveRecord:: NoEnvironmentInSchemaError

Я пытаюсь выполнить операции с базой данных для моего недавно обновленного приложения (Rails 5), и я не могу выполнять команды разрушительной базы данных локально. rails db:reset или rails db:drop.

Результат трассировки со следующими данными:

rails db:drop --trace
** Invoke db:drop (first_time)
** Invoke db:load_config (first_time)
** Execute db:load_config
** Invoke db:check_protected_environments (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config
** Execute db:check_protected_environments

rails aborted!
ActiveRecord::NoEnvironmentInSchemaError: 

Environment data not found in the schema. To resolve this issue, run: 

    bin/rails db:environment:set RAILS_ENV=development

То, что я пробовал до сих пор,

  • Настройка bin/rails db:environment:set RAILS_ENV=development, ничего не меняет ошибку.
  • Настройка переменной среды вручную для разработки.

Ничего из этого не помогло. Я ищу исправление или обходное решение.

Ответ 1

Это произошло потому, что по какой-то причине ваша таблица ar_internal_metadata была удалена или изменена. Если вы не можете отбросить базу данных через командную строку, вам нужно сделать это через ваш DBMS или клиент базы данных. Затем просто запустите rails db:create db:migrate, чтобы создать и запустить миграции.

Ответ 2

Что касается потомков, моя проблема заключалась в том, что эта схема была сгенерирована приложением rails 4, а текущее приложение, использующее ее, - rails 5. В rails 5 структура таблицы ar_internal_metadata немного изменилась. Ключевое поле должно быть строкой и содержать слово "среда", а не целое число. Эта ошибка исчезает только при изменении.

Это должно выглядеть так в Rails 5

enter image description here

то есть, измените тип ar_internatl_metadata #key на строку...

Моя ситуация немного странная с приложением rails 4 и приложением rails 5, совместно использующими одну и ту же базу данных. Когда мне нужно "обновить", у меня есть задача:

  puts "Modifying Rails 4 schema to fit Rails 5 schema"
  file_name = "./db/schema.rb"
  rails_4_ar_internal_metadata = 'create_table "ar_internal_metadata", primary_key: "key", force: :cascade do |t|'
  rails_5_ar_internal_metadata = 'create_table "ar_internal_metadata", primary_key: "key", id: :string, force: :cascade do |t|'
  new_schema = File.read(file_name).gsub(rails_4_ar_internal_metadata, rails_5_ar_internal_metadata)
  File.write(file_name, new_schema)

Ответ 3

Я получаю эту ошибку не потому, что данные изменились, а из-за ошибки в рельсах, я думаю.

Данные в этой таблице выглядят так:

enter image description here

Но запрос rails заставляет проверить, что это пустой ключ?

ActiveRecord::InternalMetadata[:environment]
   (0.5ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
   (0.2ms)  SELECT 'ar_internal_metadata'.'value' FROM 'ar_internal_metadata' WHERE 'ar_internal_metadata'.'key' IS NULL