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

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

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


person user984621    schedule 24.04.2013    source источник
comment
Как вы создаете новый элемент?   -  person ericeason    schedule 24.04.2013


Ответы (2)


Я только что столкнулся с чем-то подобным при новой установке MySql в Mac OS.

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

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

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

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

person Jeremy Green    schedule 13.05.2013
comment
Очень полезно спасибо. Я надеюсь, что они исправят это в ближайшее время. Вот еще обсуждение этой проблемы: github.com/rails/rails/issues/10307< /а> - person Michael Yagudaev; 05.07.2013

чтобы добавить к ответу Джереми, на Mac вы можете удалить строгий режим с помощью

> 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"
person montrealmike    schedule 06.11.2015