PG::InvalidParameterValue: 错误:参数“client_min_messages”的值无效:“panic”。

38
rake db:create出现错误PG :: InvalidParameterValue:ERROR:参数“client_min_messages”的值无效:“panic” 提示:可用值:debug5、debug4、debug3、debug2、debug1、log、notice、warning、error。
bundle install后尝试运行rake db:create命令。 在config文件夹中创建了database.yml文件,请查看下面内容:
development:
  adapter: postgresql
  encoding: utf8
  database: thor_development1
  username: postgres
  password:
  host: localhost

test:
  adapter: postgresql
  encoding: utf8
  database: thor_test1
  username: postgres
  password:
  host: localhost
PG::InvalidParameterValue: ERROR:  invalid value for parameter "client_min_messages": "panic"
HINT:  Available values: debug5, debug4, debug3, debug2, debug1, log, notice, warning, error.
: SET client_min_messages TO 'panic'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `async_exec'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `block in execute'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/abstract_adapter.rb:373:in `block in log'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activesupport-4.1.6/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/abstract_adapter.rb:367:in `log'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql/database_statements.rb:127:in `execute'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql/schema_statements.rb:274:in `client_min_messages='
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql_adapter.rb:634:in `set_standard_conforming_strings'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql_adapter.rb:914:in `configure_connection'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql_adapter.rb:895:in `connect'
/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql_adapter.rb:568:in `initialize'

尝试在 macOS Catalina 中安装


你能提供 config/database.yml 文件吗? - Aurelien
Aurelien添加了database.yml代码,请检查。 - user2810894
我不明白为什么你的默认 min_messages 被设置为 'panic'。你可以尝试在开发中将 min_messages: notice 设置一下。 - Aurelien
代码不起作用 :( - user2810894
错误是什么?这里有一个例子:https://github.com/rails/rails/blob/235eb91bad58ab18b45aa36fa3a1ebedfe1c4879/railties/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt#L53 - Aurelien
10个回答

77
为了使其与PostgreSQL版本12兼容,我对PostgreSQLAdapter类进行了猴子补丁,将“panic”替换为“warning”消息。 请注意,如果您可以升级activerecord gem到4.2.6或更高版本,则不需要进行此猴子补丁。我不得不这样做是因为我的项目依赖于gem activerecord-3.2.22.5
require 'active_record/connection_adapters/postgresql_adapter'

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
  def set_standard_conforming_strings
    old, self.client_min_messages = client_min_messages, 'warning'
    execute('SET standard_conforming_strings = on', 'SCHEMA') rescue nil
  ensure
    self.client_min_messages = old
  end
end

9
你需要创建一个新文件,我把它命名为“postgresql_adapter_monkeypatch.rb”,并将其放在rails目录的config/initializers/中。 - ruslan
2
我在将Postgres 9.1升级到12(Rails 3)时遇到了相同的问题。我尝试在config/initializers中使用上述补丁,但是我收到了错误消息:“ruby/1.9.1/gems/activerecord-3.2.11/lib/active_record/connection_adapters/abstract/connection_specification.rb:133:in `establish_connection': database configuration specifies nonexistent postgresql adapter (ActiveRecord::AdapterNotFound)” - pooja
@pooja,看起来你的activerecord gem版本比我之前描述的要旧。尝试将activerecord升级到v3.2.22.5版本,看看是否有帮助。 - ruslan
3
@ruslan 我在Heroku上也遇到了相同的“数据库配置指定不存在的postgresql适配器”错误,所以我在require 'active_record/connection_adapters/postgresql_adapter'之前还需要require 'active_record/base' - lacrosse
太棒了,谢谢!如果可以的话我会给这个答案投100个赞!这仅仅挽救了我们在生产环境中需要更新一个即将退役但需要几个月时间迁移客户的旧版Rails应用程序。向你传递一些真实的Karma吧! :) - Anders Hansson

11
我遇到了和你一模一样的问题,最后我找到了解决方法。我在我的gems文件夹里搜索了"panic"这个关键词,然后在我使用的 ActiveRecord 4.2.2 gem 的第313行发现了该关键词。然后我用monkey-patch的方式把它改成了"error",这样我就能继续使用db:create rake命令了。看起来很可能是ActiveRecord gem或pg gem被修改了,即使我使用旧版本的两个gem,因为几周前我还可以运行db:create,但现在只有通过这种hack才能运行。

简而言之:

我遇到了同样的问题,通过修改gem中的代码解决了,可能是gem被修改导致的问题。
gem info pg

切换到安装位置的文件夹(对于我来说是 ~/.rvm/gems/ruby-2.3.0/gems)

grep -ri 'panic' .

将与pg相关的任何内容替换为“error”或其他有效消息。


3
在我的情况下,我所改变的文件是 ...gems/activerecord-4.1.8/lib/active_record/connection_adapters/postgresql_adapter.rb - Dnyaneshwar Harer
如果有人像我一样迷失了方向,这个答案对我很有用。我在/.rvm/gems/文件夹中搜索了postgresql_adapter.rb,在编辑器中打开了该文件,然后只需将self.client_min_messages = client_min_messages, 'panic'中的"panic"替换为"warning"即可。 - Vedran Mijatović

9

8

我在旧版的 Rails 中使用 pg12 遇到了两个问题。这个文件可以解决在 Ruby 1.8 和 ActiveRecord 3.0.3 环境下的这两个问题。我把它放在了 config/initializers/postgresql_adapter_pg12.rb 中。

require 'active_record/connection_adapters/postgresql_adapter'

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
  def set_standard_conforming_strings
    old, self.client_min_messages = client_min_messages, 'warning'
    execute('SET standard_conforming_strings = on', 'SCHEMA') rescue nil
  ensure
    self.client_min_messages = old
  end

  def column_definitions(table_name) #:nodoc:
    query <<-end_sql
      SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull
        FROM pg_attribute a LEFT JOIN pg_attrdef d
          ON a.attrelid = d.adrelid AND a.attnum = d.adnum
       WHERE a.attrelid = '#{quote_table_name(table_name)}'::regclass
         AND a.attnum > 0 AND NOT a.attisdropped
       ORDER BY a.attnum
    end_sql
  end
end

非常感谢,这个帮我解决了一个使用Active Record 3.1.12的旧应用程序的问题。额外的column_definition补丁似乎对于那么老的版本是必需的。 - bappelt
非常感谢。添加这个后,我解决了问题,现在应用程序已连接到亚马逊Aurora上的PostgreSQL 13.7。 - Alvaro

7
我需要对来自@ruslan的猴子补丁进行以下修改以适配Rails 4.2.4:
require 'active_record/connection_adapters/postgresql_adapter'

module ActiveRecord
  module ConnectionAdapters
    class PostgreSQLAdapter
      def set_standard_conforming_strings
        old, self.client_min_messages = client_min_messages, 'warning'
        execute('SET standard_conforming_strings = on', 'SCHEMA') rescue nil
      ensure
        self.client_min_messages = old
      end
    end
  end
end

1

我遇到了Postgres 12.1的问题,需要回滚到9.4才得以解决。


我正在使用带有Rails v 3+的Ruby 1.9.3,并根据您的评论,我意识到这些版本的Ruby on Rails在Postgres <= 9.4上完美运行。@lucas - Javanie Campbell

1
.rvm/gems/ruby-2.3.3/gems/active_record-4.1.9/lib/active_record/connection_adapters/postgresql_adapter.rb文件中,将client_min_messages的值更改为除panic之外的任何值。有效值可以是 - debug5、debug4、debug3、debug2、debug1、log、notice、warning、error。
问题出现在ActiveRecord中较新版本的PostgreSQL适配器中,其中panic是新的默认值,并且旧的Postgres版本不支持该值。

0

不需要进行任何猴子补丁或其他操作。 通过命令行登录到您的postgresql,从那里创建数据库并授予权限。

使用以下命令进行此操作。

#to login
psql
#to create database
CREATE DATABASE super_awesome_application;
#grant the permission to the database for that user
GRANT ALL PRIVILEGES ON DATABASE super_awesome_application TO patrick;
#if you have not that user in you database create one 
CREATE USER sam WITH PASSWORD 'password';
#alter the role permission 
ALTER ROLE sam WITH SUPERUSER;

0

我也遇到了同样的问题。我使用的是Postgres 9.4.1,升级到了最新版本(12.1)。由于版本更改,我遇到了这个问题。我回退到了9.4.1。你也是这样吗?


我相信你应该能够升级至至少9.6版本。 - ruslan
这应该是一条评论,而不是一个“答案”。 - Caleb

0

在给定的日志中写着:

/Users/galaxy/.rvm/gems/ruby-2.1.2@folderName/gems/activerecord-4.1.6/lib/active_record/connection_adapters/postgresql/schema_statements.rb:274:in `client_min_messages='

转到第274行的schema statements.rb文件,并将`client_min_messages='赋值为以下任意一个值。

debug5, debug4, debug3, debug2, debug1, log, notice, warning, error


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接