Rake db:setup无法运行rails db:migrate,schema.rb不存在错误

问题描述

在Rails 6上,我希望rake db:setup执行db:createdb:migratedb:seed
我只有一个数据模型,其表的记录创建是用db/seeds.rb

编写的
# db/seeds.rb
require 'csv'

csv_text = File.read(Rails.root.join('lib','seeds','seed_first_table.csv'))
csv = CSV.parse(csv_text,:headers => true,:encoding => 'ISO-8859-1')
csv.each_with_index do |row,index|
  cr = CatProfile.new
  puts "row #{index} saved"
end

puts "There are Now #{CatProfile.count} rows in the table"

database.yml还具有一个通过sudo -u postgres createuser -s new_user

创建的新用户凭据。

但是rake db:setup返回:

Created database 'my_application_development'
Created database 'my_application_test'
my_application/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it,then try again. If you do not intend to use a database,you should instead alter /my_application/config/application.rb to limit the frameworks that will be loaded.

sudo -u postgres psql中确实建立了数据库,但是没有关系(没有种子表)

当我运行rails db:migrate

== 20201103153526 CreateCatProfiles: migrating =================================
-- create_table(:cat_profiles)
   -> 0.0091s
== 20201103153526 CreateCatProfiles: migrated (0.0092s) ========================

然后当我第二次运行rake db:setup时:

Database 'my_application_development' already exists
Database 'my_application_test' already exists
row 0 saved
row 1 saved 
...
row 1719 saved
There are Now 1720 rows in the table

注意到从第一个rake db:setup开始已经存在数据库,但是现在它可以为表添加种子

我不明白为什么第一次运行rake db:setup不能在播种前进行必要的迁移

解决方法

如果您检出rails db:setup的{​​{3}},则会发现db:setup没有运行db:migrate

创建数据库,加载架构,并使用种子数据进行初始化(使用db:reset首先也删除数据库)

db:schema:loadschema.rb中当前存在的内容加载到数据库中。