【问题标题】:rake db:create throws "database does not exist" error with postgresqlrake db:create 使用 postgresql 抛出“数据库不存在”错误
【发布时间】:2014-10-25 23:42:08
【问题描述】:

我在 Debian 7 下使用带有 postgresql 9.1 的 rails 4.1.5,但我无法在我的开发环境中创建数据库。当我跑步时

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 ...

我正在尝试创建数据库,因此它自然不存在。但是 rails 应该创建它...这是我的 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

你有什么建议吗?我已经在这里待了一个多小时,仍然无法理解为什么会这样......

谢谢!

【问题讨论】:

  • usernamepassowrd 怎么样?
  • 我认为不是这样:我使用的是postgresql“对等”身份验证方法;无论如何,以防万一,我还在database.yml中添加了usernamepassword,但仍然出现同样的错误。我还认为,如果是身份验证问题,postgres 在抱怨数据库之前会抱怨用户不存在。

标签: ruby-on-rails postgresql


【解决方案1】:

Rails 4.1 ships with spring preloader,和

新的 Rails 4.1 应用程序将附带“弹性化”的 binstub。这意味着 bin/rails 和 bin/rake 将自动利用预加载的 spring 环境。

这意味着“springified”bin/rake 将尝试预加载应用程序,进而尝试运行初始化程序,从而导致您看到的问题。

要修复/解决此问题,您需要在没有 spring 的情况下运行初始设置 rake 任务。实现这一目标的一种方法是使用 bundler 运行它:

bundle exec rake db:create

【讨论】:

  • 您正确地指出了问题。如果任何初始化程序依赖于现有数据库,则整个 rake 任务db:create 将失败。但您建议的不一定是通用解决方案。它可能适用于您使用 spring 但不会阻止其他初始化程序的情况
  • 也适用于Rails 4.2。谢谢!
  • 如果您在 Rails 4.2 + 上遇到问题,这是正确的答案。可能没有必要在 postgres 中乱搞。
  • Rails 5.0.1 相同。首先停止 Spring 或使用 DISABLE_SPRING 禁用它不会改变行为。完全不使用 Spring 运行它是唯一有效的方法。
【解决方案2】:

我发现了问题...

这与 Rails 初始化程序有关:Rails 似乎在执行 bin/rake db:create 之前加载了所有初始化程序。

而且,在这个特定的应用程序中,有一些自定义初始化器依赖于 ActiveRecord 模型(反过来,它依赖于正在创建的、可用的数据库以及对应的表)。

因此,rake 永远不会真正执行任务,它在执行初始化程序时会失败。如果我仔细阅读了完整的错误消息日志,我应该知道。这是完整的日志(见下文,粗体,违规行):

/home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapter/postgresql_adapter.rb:898:in `rescue in connect':致命:数据库“ds-dev “ 不存在 运行`$ bin/rake db:create db:migrate`来创建你的数据库(ActiveRecord::NoDatabaseError) 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:888:in `connect' 来自/home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapter/postgresql_adapter.rb:568:in `initialize' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `new' 来自/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' 来自 /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' 来自 /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' 来自 /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' 来自 /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' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize' 来自 /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' 来自 /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' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize' 来自 /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' 来自/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' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_handling.rb:113:in `retrieve_connection' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/connection_handling.rb:87:in `connection' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activerecord-4.1.5/lib/active_record/model_schema.rb:209:in `table_exists?' 来自 /home/rs/pr/ds/app/models/property.rb:32:in `get' 来自 /home/rs/pr/ds/config/initializers/custom/setup_mail.rb:3:in `' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:241:in `load' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:241:in `block in load' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:232:in `load_dependency' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:241:in `load' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:648:in `block in load_config_initializer' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/notifications.rb:161:in `instrument' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:647:in `load_config_initializer' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:612:in `block (2 levels) in ' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:611:in `each' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/engine.rb:611:in `block in' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:30:in `instance_exec' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:30:in `run' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:55:in `block in run_initializers' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:226:in `block in tsort_each' 来自 /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' 来自 /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' 来自/home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:427:in `each_strongly_connected_component_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' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:44:in `each' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:44:in `tsort_each_child' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:411:in `call' 来自/home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:411:in `each_strongly_connected_component_from' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:347:in `block in each_strongly_connected_component' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `each' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `call' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `each_strongly_connected_component' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:224:in `tsort_each' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:205:in `tsort_each' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/initializable.rb:54:in `run_initializers' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/railties-4.1.5/lib/rails/application.rb:300:in `initialize!' 来自 /home/rs/pr/ds/config/environment.rb:5:in `' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:247:in `require' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:247:in `block in require' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:232:in `load_dependency' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:247:in `require' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:92:in `preload' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:140:in `serve' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:128:in `block in run' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:122:in `loop' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application.rb:122:in `run' 来自 /home/rs/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/application/boot.rb:18:in `' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require' 来自 /home/rs/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require' 从 -e:1:in `'

我将致力于重构代码,以消除初始化程序中的任何模型依赖项(我很确定这一定是一个非常糟糕的做法)。

【讨论】:

  • + 1 用于强调更仔细地阅读错误堆栈跟踪的重要性。这样的东西就是拥有它们的全部意义。
  • 我在rack-attack gem 中遇到了同样的问题,它在初始化程序中读取数据库。因为我在运行 rake 任务时不关心 DoS 攻击,所以我将初始化程序包装在 unless defined?(Rake::Application) 中。
【解决方案3】:

您可以尝试运行此命令-

bin/rake db:create RAILS_ENV=development

或者这个命令-

bin/rake db:migrate RAILS_ENV=development

【讨论】:

    【解决方案4】:

    今天遇到了同样的问题(在 OS X 中)。

    已解决:

    psql -U postgres
    CREATE ROLE rolename WITH CREATEDB LOGIN;
    

    使用\du 检查它是否已创建。

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

    然后您可以使用bundle exec rake db:migrate 设置数据库

    【讨论】:

      【解决方案5】:

      没有一个解决方案对我有用,但这对我有用。

      $ brew services list
      $ brew services restart postgresql
      

      【讨论】:

        【解决方案6】:

        没有一个解决方案对我有用,但后来我看到一些答案提到预加载是问题的一部分。我意识到我有 config.eager_load = trueconfig/environments/development.rb。我将其更改为 false 并解决了问题。

        【讨论】:

          【解决方案7】:

          我看到两个问题,正如 is04 指出的,您的 database.yml 中可能至少需要一个 username 值。

          您还需要创建 postgres 角色:

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

          【讨论】:

          • 我试过了,但我认为不是这样:角色已经创建(实际上是超级管理员),我正在使用 postgrsql“对等”身份验证方法。我尝试在任何情况下只添加一个username,以及usernamepassword 到database.yml,但我仍然遇到同样的错误。
          • 据我所知,迁移会自动为 SQLite 创建数据库,而对于 Postgres,您必须在开发和其他环境中自行创建它。
          • 这不正确。 Rails 默认使用初始化数据库的操作系统用户作为默认database.yml 模板解释:github.com/rails/rails/blob/…。所以whoami 被用作我相信的默认值。如果数据库是用正确的用户初始化的,psql postgres -U `whoami` 应该可以工作。
          【解决方案8】:

          我遇到了同样的问题,就我而言,我在 Answer 模型本身的验证中使用了 Answer.column_name。因为测试数据库已经在我的本地创建,所以 RAILS_ENV=test rails db:create 在本地运行良好,但在 CI/CD 管道中出现相同的错误

          这是由于Rails在运行db:create命令之前加载了app/目录下的所有文件,而当时由于没有数据库存在Answer.column_names失败。

          我用过这样的东西:

            validates_uniqueness_of :content, scope: (Answer.column_names - %w[id created_at updated_at]).map(&:to_sym), message: 'Duplicate answer'
          

          这是错误的。然后我改为:

          DUPLICATE_ANSWER_SCOPE = %i[content question_id session_id]
          validates_uniqueness_of :content, scope: DUPLICATE_ANSWER_SCOPE, message: 'Duplicate answer'
          

          【讨论】:

            【解决方案9】:

            这是我用于 rails 项目的 Dockerfile。 看看这部分:

            CMD mkdir -p tmp/pids && \
                bundle exec rake db:create && \
                bundle exec rails db:migrate && \
                bundle exec rake db:seed && \
                bundle exec puma -C config/puma.rb
            

            Bundler 2.1.4、ruby 2.7.2、rails 6.0.3 兼容。 Docker 撰写部分:

            server:
                container_name: server
                build:
                  context: Server
                  dockerfile: Dockerfile
                  args:
                    ENV: 'development'
                restart: unless-stopped
                depends_on:
                  - db
                env_file:
                  - ./Server/.env
                ports:
                  - '9090:3000'
                volumes:
                  - ./Server:/app
                  - ./Server/Docker/usr/.gemrc:/root/.gemrc
                networks:
                  - app-network
            

            FROM ruby:2.7.2-alpine3.12
            
            # env and arg variables setup
            ARG APP_HOME='/app'
            ARG ENV
            ENV RAILS_ENV=$ENV \
                RACK_ENV=$ENV \
                RAILS_ROOT=$APP_HOME
            
            # timezone setup
            RUN apk add --update tzdata && \
                cp /usr/share/zoneinfo/Europe/London /etc/localtime && \
                echo "Europe/London" > /etc/timezone
            
            # building in tmp dir
            WORKDIR /tmp
            ADD Gemfile ./
            
            #install dependencies (bundler 2.1.4, ruby 2.7.2, rails 6.0.3 compatible) 
            RUN apk add --update --virtual runtime-deps postgresql-client nodejs libffi-dev readline sqlite xz && \
                apk add --virtual build-deps build-base openssl postgresql-dev libc-dev linux-headers libxml2-dev libxslt-dev readline-dev && \
                gem install bundler -v 2.1.4 && \
                bundle install --jobs=4 && \
                apk del build-deps
            
            # /app
            WORKDIR $APP_HOME
            
            # create dbs if no such, migrate, seed, start
            CMD mkdir -p tmp/pids && \
                bundle exec rake db:create && \
                bundle exec rails db:migrate && \
                bundle exec rake db:seed && \
                bundle exec puma -C config/puma.rb

            【讨论】:

              【解决方案10】:

              这是我在每次部署时运行的命令列表(包括第一个)

              //create pids folder if no yet
              mkdir -p tmp/pids
              
              //create dbs if no yet
              bundle exec rake db:create
              
              //run all new migrations
              bundle exec rails db:migrate
              
              //seed db with data if required
              bundle exec rake db:seed
              
              //start the server with config
              bundle exec puma -C config/puma.rb
              

              【讨论】:

                猜你喜欢
                • 2012-10-13
                • 2015-10-14
                • 2010-11-28
                • 1970-01-01
                • 1970-01-01
                • 2013-03-06
                • 2018-07-14
                • 2019-07-23
                相关资源
                最近更新 更多