【发布时间】:2016-02-17 23:59:00
【问题描述】:
我的 rails 版本是 4.0.0,我的 mysql 版本是 Ver 14.14 Distrib 5.7.9,适用于 Win64 (x86_64)。根据我之前的问题Here,我正在使用旧版本的rails,因为我与mysql发生了一些冲突。 (查看Kalelc我的追索权的批准答案)
运行时
rake db:migrate
我收到以下错误
== CreateUsers: migrating ====================================================
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `first_name` varchar(25), `last_name` varchar(50), `email` varchar(255) DEFAULT '' NOT NULL, `password` varchar(40), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDBC:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up'
C:in `migrate'
ActiveRecord::StatementInvalid: Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `first_name` varchar(25), `last_name` varchar(50), `email` varchar(255) DEFAULT '' NOT NULL, `password` varchar(40), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up'
C:in `migrate'
Mysql2::Error: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/db/migrate/20151116154434_create_users.rb:3:in `up'
C:in `migrate'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
我没有在我的代码中将任何值设置为 NULL,这是代码
Class CreateUsers < ActiveRecord::Migration
def up
create_table :users do |t|
t.column "first_name", :string, :limit => 25
t.string "last_name", :limit => 50
t.string "email", :default => "", :null => false
t.string "password", :limit => 40
t.timestamps
end
end
def down
drop_table :users
end
end
此代码完全正确,如我正在关注的教程中所示。我还调查了其他关于堆栈溢出的similar issues here 并遵循了给出的建议。我试过monkey patch as suggested
# lib/patches/abastract_mysql_adapter.rb
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
我将此文件插入到我在 simple_cms 应用程序的 lib 中创建的名为 patch 的文件夹中。我已将文件保存为“abstract_mysql_adapter.rb” 正如同一个猴子补丁中所建议的那样。 我已使用以下内容更新了 simple_cms 应用程序的 environment.rb
require File.expand_path('../../lib/patches/abstract_mysql_adapter.rb', __FILE__)
如果我随后运行 rake db:migrate 命令
rake aborted!
LoadError: cannot load such file -- C:/Users/Lizanne/Documents/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/config/environment.rb:3:in `<top (required)>'
Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)
C:/Users/Lizanne/Documents/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb 绝对是猴子补丁的路径。我是不是把补丁放错地方了?我在这里做错了什么,为此挠头?抱歉,如果这对某些人来说是显而易见的,但在很长一段时间禁欲后我将重新开始编码,我无法解决这个问题。非常感谢您的帮助:)
【问题讨论】:
-
尝试将猴子补丁编辑为
"int(11) auto_increment PRIMARY KEY NOT NULL" -
嘿撤消感谢您的快速响应,刚刚尝试过,我仍然得到相同的加载错误
-
这个猴子补丁需要保存到应用程序的lib还是rails的lib中
-
您可能很幸运将文件移动:
lib/patches/abastract_mysql_adapter.rb到config/initializers/abastract_mysql_adapter.rb- 但如果您只是在学习 rails,为什么不使用 sqlite(我也更喜欢 postgres 而不是 mysql,尤其是如果您最终托管您的heroku 上的应用程序) -
谢谢house9,我刚刚尝试了你的建议,我得到了完全相同的消息,但这次表明它无法在初始化程序中加载文件,即使我更改了 environment.rb 中的路径。真的卡在这里了。我回答你的问题我正在使用 mysql,因为这是我正在关注的 Lynda 教程的推荐版本。所以为了能够准确地跟随老师,我认为最好的做法是使用与他建议的完全相同的设置
标签: mysql ruby-on-rails rake primary-key dbmigrate