use*_*621 15 ruby mysql timestamp ruby-on-rails insert-into
我创建了一个新的迁移,其中提到了
...
t.timestamps
Run Code Online (Sandbox Code Playgroud)
在创建的表中添加了这两列
...
| created_at | datetime | NO (Null) | | NULL (Default) |
| updated_at | datetime | NO (Null) | | NULL (Default) |
...
Run Code Online (Sandbox Code Playgroud)
当我想创建一个新项目时,我总是收到错误消息
Mysql2::Error: Field 'created_at' doesn't have a default value: INSERT INTO `table_name` (`first_col`, `second_col`) VALUES ('a', 'b')
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我把这个miniapp发送给我的一个朋友,他能够成功运行它 - >记录是在数据库中创建的.
我错过了什么?
Jer*_*een 17
我刚刚在Mac OS上全新安装MySql时碰到了类似的东西.
我最后将其缩小为默认情况下启用"严格模式"的新版本MySql的组合,并且我的项目有一个表格,其上有一些可疑的约束.有问题的表是:has_and_belongs_to_many关系中使用的"连接表" .不知何故,该表已经创建了:created_at,并且:updated_at具有约束的属性:null => false.Rails 3.2不会自动填充:habtm关系连接表的时间戳字段.当关闭严格模式时,MySql只会填充带有清零日期的cols,例如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
Run Code Online (Sandbox Code Playgroud)
老实说,如果您不需要它们,可能最好只删除列,但我们有一些特殊情况,它们实际上是手动设置的.
添加到 Jeremy 的答案中,在 Mac 上,您可以删除严格模式
> vi /usr/local/opt/mysql/my.cnf
Run Code Online (Sandbox Code Playgroud)
然后替换
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)
和
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)