2014-09-01 158 views
41

我在Debian 7下使用rails 4.1.5和postgresql 9.1,并且我无法在我的开发环境中创建数据库。当我运行rake db:创建抛出“数据库不存在”与postgresql错误

bin/rake db:create 

我得到

home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:898:in `rescue in connect': FATAL: database "direct-dev" does not exist 
Run `$ bin/rake db:create db:migrate` to create your database (ActiveRecord::NoDatabaseError) 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:888:in `connect' 
from ... 

我想创建数据库,这样,自然,它不存在。然而轨应该创造它... ...这是我的config/database.yml中:

default: &default 
    adapter: postgresql 
    encoding: unicode 
    pool: 5 

development: 
    <<: *default 
    database: direct-dev 

而这里的PostgreSQL的日志中的一部分:

2014-09-01 19:30:40 CEST LOG: connection received: host=[local] 
2014-09-01 19:30:40 CEST LOG: connection authorized: user=rs database=direct-dev 
2014-09-01 19:30:40 CEST FATAL: database "direct-dev" does not exist 

你有任何指针?我已经在这一个多小时了,仍然不明白为什么会发生这种情况...

谢谢!

+0

'username'和'passowrd'呢? – IS04 2014-09-01 18:36:28

+0

我认为不是这样的:我使用postgresql“peer”身份验证方法;无论如何,为了以防万一,我还将'username'和'password'添加到database.yml中,并且仍然有相同的错误。我也认为,如果这是一个身份验证问题,postgres会在抱怨数据库之前抱怨用户不存在。 – 2014-09-01 21:14:54

回答

1

我看到两个问题,因为IS04指出,你可能需要至少在你的database.yml一个username值。

您还需要创建Postgres的作用:

su - postgres 
create role direct-dev with createdb login password 'password1' 
+1

我试过了,但我认为不是这样:角色已经创建(实际上是superadmin),我正在使用postgrsql“peer”身份验证方法。我试过在任何情况下只添加一个'username',并将'username'和'password'添加到database.yml中,我仍然得到相同的错误。 – 2014-09-01 21:17:45

+0

据我所知,迁移将自动为SQLite和Postgres创建数据库,您必须在开发和其他环境中自行创建数据库。 – PatNowak 2015-02-11 16:09:51

+0

这是不正确的。 Rails默认为初始化数据库的操作系统用户,因为默认的'database.yml'模板解释:https://github.com/rails/rails/blob/d7f9adf7941574d0a40a165739938d28f278bd77/railties/lib/rails/generators/rails/app/模板/配置/数据库/ postgresql.yml.tt#L28-L32。所以'whoami'被用作我相信的默认值。 'psql postgres -U \'whoami \'''''''''''如果数据库是用正确的用户初始化的,那么它应该可以工作。 – 2018-02-08 14:59:31

6

我发现这个问题...

它与Rails的初始化做:Rails的似乎执行bin/rake db:create前装入所有的初始化。

而且,在这个特殊的应用程序,有依赖于ActiveRecord模型(这又取决于数据库创建,可用且与相应的表)一些自定义初始化。

因此耙从来没有得到真正执行任务,它执行初始化时失败。如果我仔细阅读完整的错误消息日志,我应该知道。这是一个完整的日志(见下文,粗体,违规行):

 
/home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:898:in `rescue in connect': FATAL: database "ds-dev" does not exist 
Run `$ bin/rake db:create db:migrate` to create your database (ActiveRecord::NoDatabaseError) 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:888:in `connect' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:568:in `initialize' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `new' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `postgresql_connection' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:435:in `new_connection' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:445:in `checkout_new_connection' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:416:in `acquire_connection' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:351:in `block in checkout' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:350:in `checkout' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:265:in `block in connection' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:264:in `connection' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:541:in `retrieve_connection' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_handling.rb:113:in `retrieve_connection' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_handling.rb:87:in `connection' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/model_schema.rb:209:in `table_exists?' 
from /home/rs/pr/ds/app/models/property.rb:32:in `get' 
from /home/rs/pr/ds/config/initializers/custom/setup_mail.rb:3:in `' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:241:in `load' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:241:in `block in load' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:232:in `load_dependency' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:241:in `load' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:648:in `block in load_config_initializer' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/notifications.rb:161:in `instrument' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:647:in `load_config_initializer' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:612:in `block (2 levels) in ' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:611:in `each' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:611:in `block in ' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:30:in `instance_exec' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:30:in `run' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:55:in `block in run_initializers' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:226:in `block in tsort_each' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:418:in `block (2 levels) in each_strongly_connected_component_from' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:427:in `each_strongly_connected_component_from' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:417:in `block in each_strongly_connected_component_from' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:44:in `each' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:44:in `tsort_each_child' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:411:in `call' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:411:in `each_strongly_connected_component_from' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:347:in `block in each_strongly_connected_component' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `each' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `call' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `each_strongly_connected_component' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:224:in `tsort_each' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:205:in `tsort_each' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:54:in `run_initializers' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/application.rb:300:in `initialize!' 
from /home/rs/pr/ds/config/environment.rb:5:in `' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:247:in `require' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:247:in `block in require' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:232:in `load_dependency' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:247:in `require' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:92:in `preload' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:140:in `serve' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:128:in `block in run' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:122:in `loop' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:122:in `run' 
from /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application/boot.rb:18:in `' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
from /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
from -e:1:in `' 

我将努力在重构代码,以摆脱在初始化任何模型依赖关系(我敢的肯定它是一个非常糟糕的做法)。

+1

+ 1,强调更仔细地阅读错误堆栈跟踪的重要性。像这样的东西是拥有它们的全部要点。 – i2097i 2015-06-24 13:30:20

78

的Rails 4.1 ships with spring preloader,并

新的Rails 4.1的应用程序将与 “springified” binstubs发货。这意味着斌/导轨和斌/耙将自动预紧的弹簧环境的优势。

这意味着“弹性化”的bin/rake会尝试预加载应用程序,反过来会尝试运行初始化程序导致您遇到的问题。

要修复/工作解决此要无弹簧运行初始设置耙任务。实现的方法之一就是用打捆运行它来代替:

bundle exec rake db:create 
+2

您指出了正确的问题。如果任何初始化器依赖于现有的数据库,那么整个rake任务'db:create'失败。但是你提出的建议不一定是通用的解决方案。它可能适用于你正在使用'spring'的情况,但并不妨碍其他初始化程序 – Bakhshi 2016-07-08 05:42:22

+1

也适用于'Rails 4.2'。谢谢! – 0bserver07 2016-08-17 18:06:40

+1

如果您在Rails 4.2 +上遇到问题,这是正确的答案。有可能不需要在postgres中搞乱。 – 2016-11-07 16:00:29

12

你可以尝试运行此命令 -

bin/rake db:create RAILS_ENV=development 

还是这个命令 -

bin/rake db:migrate RAILS_ENV=development 
+0

这是*最后*为我工作。 ! – 2015-09-22 22:30:23

2

今天有同样的问题(在OS X中)。

与解决:

psql -U postgres 
CREATE ROLE rolename WITH CREATEDB LOGIN; 

使用\du检查,如果它的创建。

使用\password rolename为该用户/角色创建密码

那么你就可以bundle exec rake db:migrate

2

无解的设置DB为我工作,但这个工作对我来说。

$ brew services list 
$ brew services restart postgresql 
相关问题