rake db:create使用PostgreSQL抛出“数据库不存在”错误

时间:2019-04-22 09:17:47

标签: postgresql ruby-on-rails-5

我将Rails 5.2.2.1与Postgresql 10.6配合使用,并且无法在开发环境中创建数据库。当我跑步时

bin/rake db:create

bundle exec rake db:create

我明白了

rake aborted!
ActiveRecord::NoDatabaseError: FATAL:  database "mplaces_dev" does not exist
/home/user/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:696:in `rescue in connect'
/home/user/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:691:in `connect'    

我试图创建数据库,所以自然不存在。但是rails应该创建它...这是我的config / database.yml:

development:
 adapter: postgis
 database: mplaces_dev
 encoding: unicode
 username: postgres
 password: postgres
 host: localhost
 postgis_extension: true
 schema_search_path: "public,postgis"

但是我也创建了所有扩展。 我已经待了一个多小时了,但仍然不明白为什么会这样...

谢谢!

1 个答案:

答案 0 :(得分:2)

对我来说,这是因为我的一个初始化器中有一些依赖于模型的逻辑。

这在以前从来都不是问题,但是自从设置 CI 后,我需要修改我的项目,以便它从模型依赖部分的初始化程序中排除一些逻辑。

对于 initializer_example.rb:

# non model dependent
Aws.config(secret_key: xyz, access_key: zyx)

# model dependent
User.where(admin:true).update(field: value)

致:

# non model dependent
Aws.config(secret_key: xyz, access_key: zyx)

# model dependent
db_loaded = ::ActiveRecord::Base.connection_pool.with_connection(&:active?) rescue false
if db_loaded
    User.where(admin:true).update(field: value)
end

只有在数据库已加载(即在生产中)时,这才会像往常一样运行初始化程序

至于我的 CI/测试环境,我在测试之前修改了 RSPEC 以再次加载初始化程序(我知道这是不好的做法)(当然在这个阶段应该配置环境,所以这次它会正常运行)使用代码:

load "#{Rails.root}/config/initializers/initializer_example.rb"