rake db:migrate не работает при использовании ActiveRecord с Sinatra

Я пытаюсь создать очень простое приложение Sinatra, которое использует только Active Record и Sqlite3.

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

  1. Создайте базу данных, поместив следующий код в основной файл приложения:
ActiveRecord::Base.establish_connection(
  :adapter =>'sqlite3',
  :database=>'wiki.db'
)

class User < ActiveRecord::Base
  validates :username, presence: true, uniqueness: true
  validates :password, presence: true
end

  1. Чтобы создать базу данных и изменить ее структуру, создайте Rakefile со следующим содержимым:
require "./wadapp.rb"                                                                                    
require "sinatra/activerecord/rake"
  1. Сохраните файл Rake и выполните в терминале следующую команду:
rake db:create_migration NAME=create_users
  1. В db/migrate/ будет создан новый файл с именем timestamp_create_users.rb. Перейдите к этому файлу и отредактируйте его со следующим содержимым:
class CreateUsers < ActiveRecord::Migration[6.0]                                                         
  def change
    create_table :users do |t| 
      t.string :username
      t.string :password
      t.boolean :edit
      t.timestamps null: false
    end 
    User.create(username: "Admin", password: "admin", edit: true)
  end 
end
  1. В терминале выполните команду rake db:migrate.

Это последний момент, когда код перестает работать. Я вообще не получаю вывода, чтобы указать, что :users был создан, и в приложении нет доступной таблицы.

Я пытался откатиться и т. д., но нет никаких указаний на то, что таблица была создана, так что ничего не откатывается и не изменяется? Я также попытался сначала запустить rake db:create, как предлагалось в некоторых сообщениях, но получил следующую ошибку:

(in /Users/jonathonday/ruby/wad/wiki)
rake aborted!
ActiveRecord::AdapterNotSpecified: The `development` database is not configured for the `default_env` environment.

Available databases configurations are:


/Users/jonathonday/.rvm/gems/ruby-2.6.3/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/connection_specification.rb:251:in `resolve_symbol_connection'
/Users/jonathonday/.rvm/gems/ruby-2.6.3/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/connection_specification.rb:219:in `resolve_connection'
/Users/jonathonday/.rvm/gems/ruby-2.6.3/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/connection_specification.rb:140:in `resolve'
/Users/jonathonday/.rvm/gems/ruby-2.6.3/gems/activerecord-6.0.2.1/lib/active_record/connection_handling.rb:187:in `resolve_config_for_connection'
/Users/jonathonday/.rvm/gems/ruby-2.6.3/gems/activerecord-6.0.2.1/lib/active_record/connection_handling.rb:50:in `establish_connection'
/Users/jonathonday/.rvm/gems/ruby-2.6.3/gems/activerecord-6.0.2.1/lib/active_record/tasks/database_tasks.rb:187:in `create_current'
/Users/jonathonday/.rvm/gems/ruby-2.6.3/gems/activerecord-6.0.2.1/lib/active_record/railties/databases.rake:39:in `block (2 levels) in <top (required)>'
Tasks: TOP => db:create
(See full trace by running task with --trace)

Я также запустил команду rake db:migrate от имени пользователя root (sudo su) и получил другую ошибку:

(in /Users/jonathonday/ruby/wad/wiki)
rake aborted!
LoadError: cannot load such file -- sinatra
/Users/jonathonday/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Users/jonathonday/.rvm/rubies/ruby-2.6.3/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'

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


person J.Day    schedule 09.02.2020    source источник
comment
Вы создали базу данных? Пробовали откатиться? Здесь много неизвестного — мы не можем заглянуть через ваше плечо.   -  person Dave Newton    schedule 09.02.2020
comment
Извините, см. гораздо более подробное объяснение выше   -  person J.Day    schedule 09.02.2020


Ответы (2)


У меня была та же проблема, и я думаю, что нашел ответ на ваш второй вопрос, почему вам пришлось вернуться к более старой версии Active Record (5.2 вместо 6.0).

Если вы посмотрите на репозиторий sinatra-activerecord, похоже, что ActiveRecord объявлен устаревшим. ::Base.install_connection() и заменил его на set :database{}.

Итак, если вы измените свой код:

ActiveRecord::Base.establish_connection(:adapter =>'sqlite3', :database=>'wiki.db')

to

set :database, {:adapter =>'sqlite3', :database=>'wiki.db'}

Ваш код должен работать без использования более старой версии Active Record. По крайней мере, это сработало для меня.

person Charles Wisoff    schedule 06.07.2020

Мне удалось решить проблему, удалив ActiveRecord 6.0.2.1 и установив версию 5.2.4.

Кажется, это решает все проблемы, и теперь, когда я запускаю rake db:migrate, я получаю результат:

(in /Users/jonathonday/ruby/wad/wiki)
== 20200209194032 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0008s
== 20200209194032 CreateUsers: migrated (0.0178s) =============================

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

person J.Day    schedule 09.02.2020