首页 文章

未初始化的常量ActiveRecord :: ConnectionAdapters :: Mysql2Adapter :: NATIVE_DATABASE_TYPES(NameError)

提问于
浏览
5

我有运行我的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>':来自C的未初始化常量ActiveRecord :: ConnectionAda pters :: Mysql2Adapter :: NATIVE_DATABASE_TYPES(NameError) :/Users/John/Documents/RoRCmS/simple_cms/config/initializers/abstract_mysql2_adapter.rb:1:in'from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/ lib / rails / engine.rb:609:来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib的<class:Engine>中的块(2级) /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>'来自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:在tsort_each'中的块中来自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'from C:/ Ruby23-x64 / lib / ruby / 2.3.0 / tsort.rb:347:在每个'来自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'来自C:/Ruby23-x64/lib/ruby/2.3.0/tsort.rb:226:intsort_each'来自C:/ Ruby23- x64 / lib / ruby / 2.3.0 / tsort.rb:205:来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/initializable的tsort_each' .rb:54:inrun_initializers'来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/application.rb:215:初始化!'来自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:在<top(required)>'from C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:3:inrequire'from C:/ Users / John / Documents / RoRCmS / simple_cms / config.ru:3:在C中的<main>'块中:/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:ininizeize'from C:/用户/ John / Documents / RoRCmS / simple_cms / config.ru:innew'来自C:/Users/John/Documents/RoRCmS/simple_cms/config.ru:in <main>'来自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:来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/builder.rb的new_from_string': 40:inparse_file'来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack- 1.5.5 / lib / rack / server.rb:277:来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rack-1.5.5/lib/rack/server.rb的build_app_and_options_from_config' :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'from C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands.rb:73:32:来自C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in'from bin / rails:4:in require '来自bin / rails:4:in'

我现在真的需要解决这个问题..谢谢你们 .

3 回答

  • 5

    我解决了它如下 . 使用 mysql -u username -p database_name < file.sql 将遗留的sql dumpfile导入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 .

    我在Rails ActiveRecord library file中为abstract_mysql_adapter使用了与activerecord-native_db_types_override gem相关的文档和NAENT_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 包含'adapter: mysql2'我想要使用的数据库连接 .

    然后我跑了 bin/rake db:migrate 然后成功完成了迁移 .

    我已经为ActiveRecord Native Database Types Override 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

  • 4

    请尝试使用此代码:

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

    求助:我添加了gem:gem'activerecord-native_db_types_override'

相关问题