Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用rakedb:migrate命令和mysql在Rails中创建表的主要关键问题_Mysql_Ruby On Rails_Rake_Primary Key_Dbmigrate - Fatal编程技术网

使用rakedb:migrate命令和mysql在Rails中创建表的主要关键问题

使用rakedb:migrate命令和mysql在Rails中创建表的主要关键问题,mysql,ruby-on-rails,rake,primary-key,dbmigrate,Mysql,Ruby On Rails,Rake,Primary Key,Dbmigrate,我的rails版本是4.0.0,mysql版本是14.14发行版5.7.9,适用于Win64(x86_64)。我操作的是旧版本的rails,因为根据我之前的问题,我和mysql有一些冲突。(检查我的追索权的批准答案) 跑步时 rake db:migrate 我得到以下错误 == CreateUsers: migrating ==================================================== -- create_table(:users) rake ab

我的rails版本是4.0.0,mysql版本是14.14发行版5.7.9,适用于Win64(x86_64)。我操作的是旧版本的rails,因为根据我之前的问题,我和mysql有一些冲突。(检查我的追索权的批准答案)

跑步时

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
我将这个文件插入了我在simple_cms应用程序库中创建的名为patches的文件夹中。我已将该文件保存为“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)
rake中止!
LoadError:无法加载这样的文件--C:/Users/Lizanne/Documents/Code/Sites/simple\u cms/lib/patches/abstract\u mysql\u adapter.rb
C:/Users/Lizanne/Documents/Code/Sites/simple\u cms/config/environment.rb:3:in`'
任务:TOP=>db:migrate=>environment
(通过使用--trace运行任务查看完整跟踪)
C:/Users/Lizanne/Documents/Code/Sites/simple\u cms/lib/patches/abstract\u mysql\u adapter.rb绝对是通往monkey补丁的路径。我把补丁放错地方了吗?我做错了什么,在这件事上挠头?如果这对某些人来说是显而易见的,我表示歉意,但在很长时间的禁欲之后,我将重新开始编码,我无法理解这个问题。非常感谢您的帮助:)

声明为NULL的主键会产生错误:

主键中的列不能为NULL,但如果显式声明 因为NULL没有产生错误。现在出现了一个错误。例如,一个 诸如CREATE TABLE t(i INT NULL主键)之类的语句被拒绝。 类似的ALTERTABLE语句也会发生同样的情况。(Bug#13995622, 臭虫#66987,臭虫#15967545,臭虫#16545198)


但是Rails版本中的
create_表
仍然需要
主键的
默认值
NULL
。我通过更新到更新的rails版本解决了这个问题。

我最近也遇到了同样的问题

MySQL 5.7不再支持主键的空默认值

通过覆盖MySql中主键的本机默认值,您可以解决问题

在config/initializers/abstract_mysql_adapter.rb中:

class ActiveRecord::ConnectionAdapters::MysqlAdapter
  NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
class ActiveRecord::ConnectionAdapters::Mysql2Adapter
  NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
对于mysql2,它应该是config/initializers/abstract_mysql2_adapter.rb:

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

我的环境:Rails 3.0.20、MySQL 5.7.13、Ruby 1.9.3p551)中没有使用上述解决方案。可以通过覆盖
ActiveRecord::ConnectionAdapters::ColumnDefinition
类来绕过它。见下文:

class ActiveRecord::ConnectionAdapters::ColumnDefinition
  def sql_type
    type.to_sym == :primary_key ? 'int(11) auto_increment PRIMARY KEY' : base.type_to_sql(type.to_sym, limit, precision, scale) rescue type
  end 
end

将其存储在config/initializers/column_definition.rb中

我使用JRuby上的Rails应用程序通过升级mysql适配器解决了这个问题

我使用的是GemActiveRecordJDBCMySQL适配器v1.3.14,并升级到v1.3.21

在修补解决方案之前,请检查您的jdbc适配器版本。

我也有这个问题(mysql 5.7.17和Rails 4.0.0)。 我通过添加一个
文件config/initializers/mysql2_adapter.rb

require 'active_record/connection_adapters/mysql2_adapter'
class ActiveRecord::ConnectionAdapters::Mysql2Adapter
  NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
然后,在我的
environment.rb
文件中:

require File.expand_path('../initializers/mysql2_adapter', __FILE__)

请尝试将您的monkey补丁编辑为“int(11)auto_increment PRIMARY KEY NOT NULL”
Hey Undo感谢您的快速响应,刚刚尝试过,我仍然得到相同的加载错误这个猴子补丁需要保存到应用程序的lib还是rails的lib你可能会幸运地将文件移动到:
lib/patches/abastract\u mysql\u adapter.rb
config/initializers/abastract\u mysql\u adapter.rb
-但是如果你只是在学习rails,为什么不使用它呢sqlite(我也喜欢postgres而不是mysql,特别是如果你最终在heroku上托管你的应用程序)谢谢house9,我刚刚尝试了你的建议,我得到了完全相同的消息,但这次声明它无法在initilizer中加载文件,即使我在environment.rb中更改了路径。真的困在这里了。我回答你的问题,我使用mysql,因为这是我下面介绍的Lynda教程的推荐版本。因此,为了能够完全听懂老师的话,我认为最好的做法是使用与他建议的完全相同的设置(非常高6.)实际上,由于与railties、rails和mysql发生了一些冲突,我恢复到了旧的rails副本。我会看看我是否能找到一个版本,我不会得到这种冲突,如这里所述[我可以问一下你使用的rails是什么版本吗?这样我就可以更新到那个版本了。谢谢谢谢你,这很有意义,a)我没有发现地址上的类型,很努力地发现了,我也在使用mysql2,所以我猜lib/patches/abastract\u mysql\u adapter.rb调用不起作用。我甚至没有想到。非常感谢:)这是正确的回答。不知道它的质量有多低。可以只使用monkeypatch
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
,如前所述,独立于实际的适配器。我在尝试db迁移时也面临同样的问题。请告诉我Rails 3.2的config/initializers/abstract_mysql2_adapter.rbWorks的文件路径。这个解决方案对我很有效。其他解决方案在
schema:load
上对我很有效,但是如果我运行
rails generate migration
,我会遇到一个本机\u数据库\u类型的未初始化常量错误。你的解决方案没有问题。谢谢。非常感谢。获取
TypeError:superclass失配对于rake测试中的类ColumnDefinition
。我是否遗漏了一些愚蠢的东西?注意,这在Rails 5.1上不再有效。好消息是Rails 5.1将主键的默认列类型设置为
bigint
,但坏消息是它是
signed
而不是
unsigned
。并且重写默认lik并不是那么容易e您正在执行此操作。如果希望
无符号bigint
作为默认值,请选中ou