2013-04-24 1 views
13

Я создал новую миграцию, где упоминаетсяRails 3.2 + MySQL: Ошибка: Поле «created_at» не имеет значения по умолчанию: INSERT INTO

... 
t.timestamps 

в созданной таблице добавлены эти две колонки

... 
| created_at | datetime | NO (Null) |  | NULL (Default) |     
| updated_at | datetime | NO (Null) |  | NULL (Default) | 
... 

Когда я хочу, чтобы создать новый элемент, я всегда получаю сообщение об ошибке

Mysql2::Error: Field 'created_at' doesn't have a default value: INSERT INTO `table_name` (`first_col`, `second_col`) VALUES ('a', 'b') 

ли я что-то отсутствует? Я отправил этот miniapp моему другу, и он может успешно запустить его -> запись создается в базе данных.

Что мне не хватает?

+0

Как вы создаете новый элемент? – ericeason

+0

'@photo = Photo.new (params [: photo])' ... '@ photo.save' – user984621

ответ

16

Я просто столкнулся с чем-то похожим на новую установку MySql на Mac OS.

Я, наконец, сузил его до сочетания новых версий MySql, включив по умолчанию «строгий режим», а мой проект имеет таблицу с некоторыми сомнительными ограничениями на нее. В рассматриваемой таблице была «таблица соединений», используемая в отношении :has_and_belongs_to_many. Каким-то образом эта таблица была создана с :created_at и :updated_at атрибутами, которые имели ограничение :null => false на них. Rails 3.2 не автоматически заполняет поля метки времени для таблиц соединений :habtm. Когда строгий режим отключен, MySql просто заполнит cols нулевыми датами, например 0000-00-00 00:00:00. При включенном строгом режиме возникает исключение.

Чтобы устранить проблему, я выполнил миграцию, чтобы поля timestamp имели значение NULL. Как это:

class ChangeNullableForTimestampsOnThing1sThing2s < ActiveRecord::Migration 
    def up 
    change_column(:thing1s_thing2s, :created_at, :datetime, :null => true) 
    change_column(:thing1s_thing2s, :updated_at, :datetime, :null => true) 
    end 

    def down 
    change_column(:thing1s_thing2s, :created_at, :datetime, :null => false) 
    change_column(:thing1s_thing2s, :updated_at, :datetime, :null => false) 
    end 
end 

Честно говоря, это, вероятно, лучше просто опустить столбцы, если вы не нуждаетесь в них, но у нас есть несколько особых случаев, когда они на самом деле получить установленные вручную.

+1

Очень полезно поблагодарить вас. Надеюсь, они скоро это исправит. Ниже приведено обсуждение проблемы: https://github.com/rails/rails/issues/10307 –

4

добавить к ответу Джереми, на макинтош вы можете удалить строгий режим с

> vi /usr/local/opt/mysql/my.cnf 

замените

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

с

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 
Смежные вопросы