错误:列“increment_by”不存在 - Postgres 10和Rails 5

时间:2018-05-08 20:53:05

标签: ruby-on-rails postgresql ruby-on-rails-5

这似乎是Postgres 10的一个常见错误,但我不确定它只是Postgres 10还是它因为我也使用Rails 5。我在Digital Ocean上有一个Rails 5应用程序正准备上线,当我开始实现备份时,我遇到了一个巨大的问题。当我尝试使用Navicat或直接使用pg_dump进行备份时,我遇到以下错误 - [Err] [Bak] Get sequences: ERROR: column "increment_by" does not exist LINE 1: SELECT last_value, increment_by, max_value, min_value, cache...

我无法弄清楚要做什么,并且已经有太多的信息已经添加到网站上以便将其拆除并重新开始。我希望有人在这里找到了解决办法,至少允许我执行备份,这样我就可以用正确的版本重新创建数据库。

2 个答案:

答案 0 :(得分:2)

我正在升级旧版应用程序,并在Rails 4.2中遇到了这个问题。我在#31330中获取了更改,并将其放入config / initializers / backport_pg_10_support_to_rails_4.rb的初始化程序中,这对我有用:

require 'active_record/connection_adapters/postgresql/schema_statements'

#
# Monkey-patch the refused Rails 4.2 patch at https://github.com/rails/rails/pull    /31330
#
# Updates sequence logic to support PostgreSQL 10.
#

module ActiveRecord
  module ConnectionAdapters
    module PostgreSQL
      module SchemaStatements
        # Resets the sequence of a table's primary key to the maximum value.
        def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc:
          unless pk and sequence
            default_pk, default_sequence = pk_and_sequence_for(table)

            pk ||= default_pk
            sequence ||= default_sequence
          end

          if @logger && pk && !sequence
            @logger.warn "#{table} has primary key #{pk} with no default sequence"
          end

          if pk && sequence
            quoted_sequence = quote_table_name(sequence)
            max_pk = select_value("SELECT MAX(#{quote_column_name pk}) FROM #{quote_table_name(table)}")
            if max_pk.nil?
              if postgresql_version >= 100000
                minvalue = select_value("SELECT seqmin FROM pg_sequence WHERE seqrelid = #{quote(quoted_sequence)}::regclass")
              else
                minvalue = select_value("SELECT min_value FROM #{quoted_sequence}")
              end
            end

            select_value <<-end_sql, 'SCHEMA'
              SELECT setval(#{quote(quoted_sequence)}, #{max_pk ? max_pk : minvalue}, #{max_pk ? true : false})
            end_sql
          end
        end
      end
    end
  end
end

答案 1 :(得分:0)

万一有人使用Rails 4.1(在我的情况下为4.1.16)遇到了这个问题,那么Rails 4.2的答案(此处为https://github.com/rails/rails/issues/28780#issuecomment-354868174)效果很好,但我必须做出一个更改才能使其正常工作-我将module PostgreSQL更改为class PostgreSQLAdapter