2013-04-24 10 views
13

ich eine neue Migration geschaffen, woRails 3.2 + MySQL: Fehler: Feld 'created_at' keinen Standardwert haben: INSERT INTO

erwähnt wird
... 
t.timestamps 

in der erstellten Tabelle werden diese zwei Spalten hinzugefügt

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

Wenn ich ein neues Element erstellen möchten, erhalte ich immer die Fehlermeldung

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

Bin ich etwas fehlt? Ich habe dieses Miniapp an einen Freund geschickt und er kann es erfolgreich ausführen -> der Datensatz wird in der Datenbank erstellt.

Was fehlt mir?

+0

Wie schaffen Sie das neue Element entfernen? – ericeason

+0

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

Antwort

16

Ich stieß gerade auf etwas ähnliches auf einer neuen Installation von MySql auf Mac OS.

Ich habe es schließlich auf die Kombination von neueren Versionen von MySql eingegrenzt, die standardmäßig "strict mode" einschalten, und mein Projekt hat eine Tabelle mit fragwürdigen Einschränkungen. Die fragliche Tabelle war die "Join-Tabelle", die in einer :has_and_belongs_to_many-Beziehung verwendet wurde. Irgendwie wurde diese Tabelle mit :created_at und :updated_at Attributen erstellt, die eine Beschränkung von :null => false auf ihnen hatten. Rails 3.2 füllt die Zeitstempelfelder für Join-Tabellen der :habtm-Beziehungen nicht automatisch auf. Wenn der strikte Modus ausgeschaltet ist, wird MySql nur die Spalten mit nullten Daten füllen, wie 0000-00-00 00:00:00. Wenn der strikte Modus aktiviert ist, wird eine Ausnahme ausgelöst.

Um das Problem zu beheben, habe ich eine Migration ausgeführt, damit die Zeitstempelfelder null sind. Wie folgt aus:

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 

Ehrlich gesagt, ist es wahrscheinlich besser, nur die Spalten fallen, wenn Sie sie nicht brauchen, aber wir haben ein paar spezielle Fälle, in denen sie tatsächlich von Hand gesetzt bekommen.

+1

Sehr hilfreich danke. Ich hoffe, sie reparieren das bald. Hier ist eine Diskussion über das Thema: https://github.com/rails/rails/issues/10307 –

4

zu Jeremys Antwort, auf einem Mac hinzufügen Sie Strict-Modus mit

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

dann

ersetzen
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

mit

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"