2013-04-24 5 views
13

मैं एक नया माइग्रेशन, जहां बनाया तालिका मेंरेल 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') 

प्राप्त मैं कुछ याद आ रही है? मैंने इस मिनीएप को मेरे एक दोस्त को भेजा और वह इसे सफलतापूर्वक चलाने में सक्षम है -> रिकॉर्ड डेटाबेस में बनाया गया है।

मुझे क्या याद आ रही है?

+0

आप नया आइटम कैसे पैदा कर रहे साथ

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

की जगह? – ericeason

+0

'@photo = Photo.new (पैराम्स [: फोटो])' ... '@ photo.save' – user984621

उत्तर

16

मै मैक ओएस पर माइस्क्ल के एक नए इंस्टॉलेशन पर कुछ ऐसा ही चला गया।

अंत में मैंने इसे "सख्त मोड" पर बदलकर माईएसक्ल के नए संस्करणों के संयोजन के लिए संकुचित कर दिया, और मेरे प्रोजेक्ट में कुछ संदिग्ध बाधाओं के साथ एक टेबल है। प्रश्न में तालिका :has_and_belongs_to_many संबंध में उपयोग की जाने वाली "तालिका में शामिल" थी। किसी भी तरह से उस तालिका को :created_at, और :updated_at गुणों के साथ बनाया गया था जिन पर :null => false की बाधा थी। रेल 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 

ईमानदारी से, यह शायद अगर तुम उन्हें जरूरत नहीं है बस कॉलम ड्रॉप करने के लिए बेहतर है, लेकिन हम विशेष मामलों में जहां वे वास्तव में मैन्युअल रूप से तैयार हो जाओ के एक जोड़े की है।

+1

बहुत उपयोगी धन्यवाद। मुझे उम्मीद है कि वे जल्द ही इसे ठीक करेंगे। इस मुद्दे पर अधिक चर्चा यहां दी गई है: https://github.com/rails/rails/issues/10307 –

4

जेरेमी के जवाब में जोड़ने के लिए, पर एक मैक आप

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

साथ सख्त मोड निकाल सकते हैं तो

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 
संबंधित मुद्दे