CLÉ PRIMAIRE problème avec la création des tables dans les Rails à l'aide de rake db:migrate commande 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). Je suis d'exploitation d'une ancienne version de rails que j'ai été faire quelques affrontements avec mysql comme par ma question précédente Ici. (vérifier Kalelc's approuvé réponse à mon recours)
lors de l'exécution
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 définissez pas les valeurs 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 tutos je suis. J'ai également étudié d'autres des problèmes similaires ici sur stack overflow, et ont suivi les conseils donnés. J'ai essayé le monkey patch comme l'a 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éé et appelé les patchs à l'intérieur de la lib de mon simple_cms application. J'ai enregistré vers le bas le fichier en tant que "abstract_mysql_adapter.rb"
comme suggéré dans le même monkey patch.
J'ai mis à jour mon environnement.rb de la simple_cms application avec le suivant
require File.expand_path('../../lib/patches/abstract_mysql_adapter.rb', __FILE__)
si je puis exécutez un rake db:migrate commande
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 certainement le chemin à la monkey patch. Ai-je mettre le patch dans le mauvais endroit? Ce que je fais mal ici, de me gratter la tête sur celui-ci? Toutes mes excuses si c'est évident pour certains, mais je suis de retour pour le codage, après une très longue abstinence et je ne peux pas obtenir ma tête autour de la question. Merci beaucoup d'avance pour votre aide 🙂
- Essayez de modifier votre singe-patch pour
"int(11) auto_increment PRIMARY KEY NOT NULL"
- Hey Annuler merci pour la réponse rapide, juste essayé et j'obtiens toujours la même erreur de Chargement
- est-ce à monkey patch doivent être enregistrées vers le bas dans le répertoire lib de l'application ou de la lib de rails
- vous pourriez avoir de la chance de déplacer le fichier:
lib/patches/abastract_mysql_adapter.rb
àconfig/initializers/abastract_mysql_adapter.rb
- mais si vous êtes seulement à apprendre rails pourquoi ne pas utiliser sqlite (j'ai également en faveur des postgres sur mysql, surtout si vous mettez fin à l'hébergement de vos applications sur heroku) - Grâce house9, j'ai juste essayé de vous la suggestion et j'obtiens exactement le même message, mais cette fois, indiquant qu'il ne peut pas charger le fichier dans le initilizer même si j'ai changé le chemin d'accès dans l'environnement.rb. Vraiment coincé ici. Je réponds à votre question, je suis en utilisant mysql comme c'est la version recommandée pour les Lynda tutoriels je suis. ainsi, pour être en mesure de suivre l'enseignant exactement, j'ai pensé qu'il valait mieux s'exercer à utiliser exactement le même jeu, comme il le suggère
rake aborted! LoadError: cannot load such file -- C:/Users/Lizanne/Documents/Code/Sites/simple_cms/config/initializers/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)
- juste essayé une
bundle exec rake db:migrate
et qui ne fonctionne pas non plus, même erreur - Mettre votre singe patch dans les initialiseurs a fonctionné pour moi. Rails 3.2, MySQL 5.7.10.
- Je sais que c'est un vieux sujet, mais la question est en effet une faute de frappe. Vous essayez de charger
abstract...
mais le fichier a été nomméabAstract...
- oh rly merci vous étudier 😀
Vous devez vous connecter pour publier un commentaire.
J'ai trop a récemment été confronté à la même question.
MySQL 5.7 ne supporte plus la valeur null par défaut les valeurs de la clé primaire.
En substituant le Natif par défaut pour les clés primaires dans MySql, vous pouvez résoudre votre problème.
Dans config/initializers/abstract_mysql_adapter.rb:
Pour mysql2 il convient de config/initializers/abstract_mysql2_adapter.rb:
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
comme décrit, indépendamment de l'adaptateur.N'avons pas de chance avec les solutions ci-dessus (Mon env: Rails 3.0.20, MySQL 5.7.13, Ruby 1.9.3p551). A été en mesure de se déplacer par l'écrasement de la
ActiveRecord::ConnectionAdapters::ColumnDefinition
classe. Voir ci-dessous:Stocké dans le fichier config/initializers/column_definition.rb
schema:load
mais si j'ai coururails generate migration
j'ai été présenté avec un uninitialized constant d'erreur pour le NATIVE_DATABASE_TYPES. Votre solution a fonctionné sans problème. Je vous remercie.TypeError: superclass mismatch for class ColumnDefinition
sur râteau tests. Ai-je raté quelque chose de stupide?J'ai eu ce problème aussi (mysql 5.7.17 et les Rails 4.0.0).
J'ai corrigé par l'ajout d'un
file config/initializers/mysql2_adapter.rb
et puis, à mon
everionment.rb
fichier:Depuis MySQL 5.7.3 une clé primaire déclarée NULLE génère une erreur:
Mais la
create_table
dans les Rails de la version veut toujours unDEFAULT
ouNULL
pour laPRIMARY KEY
. J'ai résolu le problème en mettant à jour vers une version plus récente de rails version.J'ai résolu ce problème avec une application Rails sur JRuby je suis en train de travailler sur la mise à niveau de la
mysql-adapter
.J'ai été en utilisant le gem activerecord-jdbcmysql-adaptateur v1.3.14 et mis à jour de v1.3.21
Vérifier votre jdbc adaptateur version avant de monkey patching une solution.