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

cod*_*aks 5 postgresql ruby-on-rails-5

我正在使用 Rails 5.2.2.1 和 postgresql 10.6,并且无法在我的开发环境中创建数据库。当我跑步时

bin/rake db:create
Run Code Online (Sandbox Code Playgroud)

或者

bundle exec rake db:create
Run Code Online (Sandbox Code Playgroud)

我明白了

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'    
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建数据库,因此它自然不存在。然而,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"
Run Code Online (Sandbox Code Playgroud)

不过我也创建了所有扩展。我已经研究了一个多小时了,但仍然不明白为什么会发生这种情况......

谢谢!

Nem*_*ion 5

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

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

对于initializer_example.rb:

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

# model dependent
User.where(admin:true).update(field: value)
Run Code Online (Sandbox Code Playgroud)

到:

# 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
Run Code Online (Sandbox Code Playgroud)

仅当数据库已加载(即在生产中)时,这才会照常运行初始化程序

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

load "#{Rails.root}/config/initializers/initializer_example.rb"
Run Code Online (Sandbox Code Playgroud)