relacionadas - PRIMARIO CLAVE problema al crear tablas en Rails usando rake db: migrate command with mysql
insertar datos en tablas relacionadas mysql java (5)
No tuve suerte con las soluciones anteriores (My env: Rails 3.0.20, MySQL 5.7.13, Ruby 1.9.3p551). ActiveRecord::ConnectionAdapters::ColumnDefinition
sobrescribiendo la clase ActiveRecord::ConnectionAdapters::ColumnDefinition
. Vea abajo:
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
Almacenado esto en config / initializers / column_definition.rb
Mi versión de rails es 4.0.0, mi versión de mysql es Ver 14.14 Distrib 5.7.9, para Win64 (x86_64). Estoy operando una versión anterior de rieles, ya que estaba teniendo algunos choques con el mysql según mi pregunta anterior Here . ( Kalelc la respuesta aprobada de Kalelc para mi recurso)
al correr
rake db:migrate
Obtuve el siguiente error
== 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)
No establezco ningún valor en NULL en mi código, aquí está el código
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
Este código es exactamente como se muestra en los tutoriales que estoy siguiendo. También he investigado otros problemas similares aquí en el desbordamiento de pila y he seguido los consejos dados. He probado el parche de mono como sugerí
# lib/patches/abastract_mysql_adapter.rb
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
Inserté este archivo en una carpeta que he creado parches llamados dentro de la lib de mi aplicación simple_cms. He guardado el archivo como "abstract_mysql_adapter.rb" como se sugiere en el mismo parche de mono. He actualizado mi environment.rb de la aplicación simple_cms con lo siguiente
require File.expand_path(''../../lib/patches/abstract_mysql_adapter.rb'', __FILE__)
si luego ejecuto un rake db: migrate command
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: /Usuarios/Lizanne/Documents/Code/Sites/simple_cms/lib/patches/abstract_mysql_adapter.rb es definitivamente el camino hacia el parche de mono. ¿He puesto el parche en el lugar equivocado? ¿Qué estoy haciendo mal aquí, rascándome la cabeza por esto? Pido disculpas si esto es obvio para algunos, pero estoy volviendo a programar después de una abstinencia muy larga y no puedo entender el problema. Muchas gracias de antemano por su ayuda :)
Resolví este problema con una aplicación Rails en JRuby en la que estoy trabajando actualizando el mysql-adapter
.
Estaba usando la gema activerecord-jdbcmysql-adapter v1.3.14 y actualicé a v1.3.21
Verifique la versión de su adaptador jdbc antes de aplicar una solución a Monkey.
También tuve este problema (mysql 5.7.17 y Rails 4.0.0). Lo arreglé agregando 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
y luego, en mi archivo everionment.rb
:
require File.expand_path(''../initializers/mysql2_adapter'', __FILE__)
Yo también recientemente enfrenté el mismo problema.
MySQL 5.7 ya no admite valores nulos predeterminados para la clave principal.
Al anular el valor predeterminado nativo para las claves primarias en MySql, puede resolver su problema.
En config / initializers / abstract_mysql_adapter.rb:
class ActiveRecord::ConnectionAdapters::MysqlAdapter
NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
Para mysql2 debería ser config / initializers / abstract_mysql2_adapter.rb:
class ActiveRecord::ConnectionAdapters::Mysql2Adapter
NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
end
Desde MySQL 5.7.3 una clave primaria declarada como NULL produce un error:
Las columnas en una CLAVE PRIMARIA deben ser NO NULAS, pero si se declaran explícitamente como NULL, no se produce ningún error. Ahora se produce un error. Por ejemplo, se rechaza una instrucción como CREATE TABLE t (i INT PRIMER NULA CLAVE). Lo mismo ocurre con sentencias similares de ALTER TABLE. (Error # 13995622, Error # 66987, Error # 15967545, Error # 16545198)
Pero el create_table
en su versión de Rails todavía quiere un DEFAULT
o NULL
para la PRIMARY KEY
. He resuelto el problema actualizándolo a una nueva versión de rieles.