web-dev-qa-db-fra.com

PRIMARY KEY problème avec la création de tables dans Rails en utilisant la commande rake db: migrate avec mysql

Ma version de Rails est 4.0.0, ma version de mysql est Ver 14.14 Distrib 5.7.9, pour Win64 (x86_64). J'utilise une ancienne version de Rails car j'obtenais des affrontements avec le mysql selon ma question précédente ici . (vérifiez Kalelc la réponse approuvée de mon recours)

en courant

rake db:migrate 

J'obtiens l'erreur suivante

==  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)

Je ne mets aucune valeur à NULL dans mon code, voici le code

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

Ce code est exactement comme indiqué dans les tutoriels que je suis. J'ai également étudié d'autres problèmes similaires ici sur le débordement de la pile et j'ai suivi les conseils donnés. J'ai essayé le patch de singe comme suggéré

# lib/patches/abastract_mysql_adapter.rb
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
  NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end

J'ai inséré ce fichier dans un dossier que j'ai créé appelé patchs dans la bibliothèque de mon application simple_cms. J'ai enregistré le fichier en tant que "abstract_mysql_adapter.rb" comme suggéré dans le même patch de singe. J'ai mis à jour mon environment.rb de l'application simple_cms avec ce qui suit

require File.expand_path('../../lib/patches/abstract_mysql_adapter.rb', __FILE__)

si je lance ensuite une commande 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 est très certainement le chemin vers le patch de singe. Ai-je mis le patch au mauvais endroit? Qu'est-ce que je fais mal ici, me gratter la tête sur celui-ci? Je m'excuse si cela est évident pour certains, mais je reviens au codage après une très longue abstinence et je ne peux pas résoudre ce problème. Merci d'avance pour votre aide :)

23
Aerosewall1

J'ai moi aussi récemment rencontré le même problème.

MySQL 5.7 ne prend plus en charge les valeurs par défaut nulles pour la clé primaire.

En remplaçant la valeur par défaut native pour les clés primaires dans MySql, vous pouvez résoudre votre problème.

Dans config/initializers/abstract_mysql_adapter.rb:

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

Pour mysql2, ce devrait être config/initializers/abstract_mysql2_adapter.rb:

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

N'a pas eu de chance avec les solutions ci-dessus (Mon env: Rails 3.0.20, MySQL 5.7.13, Ruby 1.9.3p551). A pu obtenir autour d'elle en écrasant le ActiveRecord::ConnectionAdapters::ColumnDefinition classe. Voir ci-dessous:

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

Stocké cela dans config/initializers/column_definition.rb

12
Andy Day

J'ai aussi eu ce problème (mysql 5.7.17 et Rails 4.0.0). Je l'ai résolu en ajoutant un file 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

et puis, dans mon everionment.rb fichier:

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

Depuis MySQL 5.7. une clé primaire déclarée comme NULL produit une erreur:

Les colonnes d'une PRIMARY KEY doivent être NOT NULL, mais si elles sont déclarées explicitement comme NULL, aucune erreur n'a été générée. Maintenant, une erreur se produit. Par exemple, une instruction telle que CREATE TABLE t (i INT NULL PRIMARY KEY) est rejetée. La même chose se produit pour des instructions ALTER TABLE similaires. (Bogue n ° 13995622, bogue n ° 66987, bogue n ° 15967545, bogue n ° 16545198)

Mais le create_table dans votre version Rails veut toujours un DEFAULT ou NULL pour le PRIMARY KEY. J'ai résolu le problème en mettant à jour vers une version plus récente Rails.

2
H6.

J'ai résolu ce problème avec une application Rails sur JRuby sur laquelle je travaille en mettant à niveau le mysql-adapter.

J'utilisais le gem activerecord-jdbcmysql-adapter v1.3.14 et mis à niveau vers v1.3.21

Vérifiez la version de votre adaptateur jdbc avant de corriger une solution par monkey.

0
Mateus Q.