【问题标题】:uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES (NameError)未初始化的常量 ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES (NameError)
【发布时间】:2016-09-15 21:08:12
【问题描述】:

我在运行我的 Rails 服务器时遇到问题。我在初始化程序中设置了 abstract_mysql2_adapters,包括:

class ActiveRecord::ConnectionAdapters::Mysql2Adapter
NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end

它解决了我的 rake db:migrate 问题,但是当我尝试运行我的 rails 服务器时,它给了我这个错误。

C:/Users/XXXX/Documents/RoRCmS/simple_cms/config/initializers/abstract_mysql2_adapter.rb:2:in <class:Mysql2Adapter>': uninitialized constant ActiveRecord::ConnectionAda pters::Mysql2Adapter::NATIVE_DATABASE_TYPES (NameError) from C:/Users/John/Documents/RoRCmS/simple_cms/config/initializers/abstract_mysql2_adapter.rb:1:in' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/engine.rb:609:in block (2 levels) in <class:Engine>' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/engine.rb:608:ineach' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/engine.rb:608:in block in <class:Engine>' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable.rb:30:ininstance_exec' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable.rb:30:in run' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable.rb:55:inblock in run_initializers' 来自 C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:228:in block in tsort_each' from C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:350:inblock (2 个级别) in each_strongly_connected_component' 来自 C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:431:in each_strongly_connected_component_from' from C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:349:inblock in each_strongly_connected_component' 来自 C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:347:in each' from C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:347:incall' 来自 C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:347:in each_strongly_connected_component' from C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:226:intsort_each' 来自 C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:205:in tsort_each' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable.rb:54:inrun_initializers' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/application.rb:215:in initialize!' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/railtie/configurable.rb:30:inmethod_missing' 来自 C:/Users/John/Documents/RoRCmS/simple_cms/config/environment.rb:5:in <top (required)>' from C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:3:inrequire' 来自 C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:3:in block in <main>' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb:55:ininstance_eval' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb:55:in initialize' from C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:innew' 来自 C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:in <main>' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb:49:ineval' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb:49:in new_from_string' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb:40:inparse_file' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/server.rb:277:in build_app_and_options_from_config' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/server.rb:199:inapp' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands/server.rb:48:in app' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/server.rb:314:inwrapped_app' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands/server.rb:75:in start' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands.rb:78:inblock in ' 来自 C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in tap' from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in' 来自 bin/rails:4:in require' from bin/rails:4:in'

我现在真的需要解决这个问题。谢谢大家。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord


    【解决方案1】:

    我解决了它如下。使用mysql -u username -p database_name &lt; file.sql 将旧版sql 转储文件导入MySQL 后,我继续使用bin/rake db:migrate 执行迁移,但遇到错误Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead

    所以我尝试了和你一样的猴子补丁,正如用户 pjg 在这里https://github.com/rails/rails/pull/13247#issuecomment-32425844 所建议的那样,但后来我遇到了你的错误

    uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES (NameError)
    

    我听从了用户 John Geliberte 的建议,并使用 gem 'activerecord-native_db_types_override' 更新了我的 Gemfile,并检查了我是否还有 gem 'mysql2'(不是导致其他错误的“activerecord-mysql2-adapter”)并运行了bundle install

    我使用了与activerecord-native_db_types_override gem 相关的文档,并为abstract_mysql_adapter 使用Rails ActiveRecord library file 中提到的NATIVE_DATABASE_TYPES 属性,因此我进行了以下更改:

    我创建了 config/initializers/abstract_mysql2_adapter.rb 并添加了:

    require 'active_record/connection_adapters/mysql2_adapter'
    NativeDbTypesOverride.configure({
      ActiveRecord::ConnectionAdapters::Mysql2Adapter => {
        primary_key: "int(11) auto_increment PRIMARY KEY"
      }
    })
    

    我创建了 config/environment.rb 并添加以下内容以加载猴子补丁:

    require File.expand_path('../initializers/abstract_mysql2_adapter.rb', __FILE__)
    

    我检查了 config/database.yml 是否包含我想使用的数据库连接的“适配器:mysql2”。

    然后我运行bin/rake db:migrate,它成功地执行了迁移。

    我已经为 ActiveRecord 本机数据库类型覆盖 Gem 的文档创建了 pull request

    不过,从 MySQL 5.7 降级到 5.5 要容易得多。

    我的系统:

    • mysql -Vmysql Ver 14.14 Distrib 5.7.13
    • rails -v4.2.4
    • ruby -vruby 2.3.0p0

    【讨论】:

      【解决方案2】:

      已解决:我添加了 gem:gem 'activerecord-native_db_types_override'

      【讨论】:

        【解决方案3】:

        试试这个代码:

        class ActiveRecord::ConnectionAdapters::Mysql2Adapter
          def modify_types(types)
            super
            types[:primary_key] = "int(11) auto_increment PRIMARY KEY"
            types
          end
        end
        

        【讨论】:

        • 它解决了我的 Rails 服务器命令问题,但它给出了这个错误:Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL
        • 如果在主键定义中添加 NOT NULL 会怎样
        • 我试过 int(11) auto_increment PRIMARY KEY NOT NULL 但仍然给我同样的错误
        猜你喜欢
        • 2017-07-07
        • 2015-02-24
        • 2020-10-13
        • 2023-03-31
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-26
        相关资源
        最近更新 更多