Eu estava usando o seguinte comando dentro de uma migração para preencher uma tabela após sua criação.
Fixtures.create_fixtures('test/fixtures', 'one_csv_to_import')
Ele estava funcionando bem com versões anteriores do MySQL, mas agora na versão 5.6 ele começou a abortar a migração sempre que for encontrado um valor NULL para uma coluna decimal.
Como isso:
CREATE TABLE `example_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`one_column` decimal(6,2) DEFAULT 0.00,
`another_column` int(11) DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Portanto, ter um arquivo de entrada como este one_csv_to_import.csv
:
id,one_column,another_column
1,,2
E executando uma migração, ele falhará em dizer
Mysql::Error: Incorrect decimal value: '' for column 'one_column' at row 1: INSERT INTO `example_table` (`id`, `one_column`, `another_column`) VALUES (1, '', 2)
A única maneira que encontrei de contornar o problema foi substituir o Fixtures.create_fixtures
por
# setting default values for created_at and updated_at
execute <<-SQL
ALTER TABLE example_table MODIFY COLUMN created_at DATETIME NOT NULL DEFAULT now()
SQL
execute <<-SQL
ALTER TABLE example_table MODIFY COLUMN updated_at DATETIME NOT NULL DEFAULT now()
SQL
# using the MySQL-way to import CSVs
ActiveRecord::Base.connection.execute <<-SQL
LOAD DATA LOCAL INFILE 'test/fixtures/one_csv_to_import.csv'
INTO TABLE example_table
FIELDS
TERMINATED BY ','
LINES TERMINATED BY 'n'
IGNORE 1 LINES
(
id,one_column,another_column
);
SQL
Se você encontrar alguma outra solução para fazer o MySQL aceitar esses valores, comente abaixo.
Obrigado,
NC