2014-06-19 6 views
5

नहीं बनाई गई हैं, मैं अपने सर्वर के लिए Sequelize का उपयोग करता हूं (mysql dialect के साथ); Sequelize के दस्तावेज़ में लिखा गया है कि यह:Sequelize के साथ विदेशी कुंजी

var Task = this.sequelize.define('Task', { title: Sequelize.STRING }) 
, User = this.sequelize.define('User', { username: Sequelize.STRING }) 

User.hasMany(Task) 
Task.belongsTo(User) 

बाधाओं के साथ स्वचालित रूप से विदेशी कुंजी संदर्भ बनाता है; लेकिन मेरे लिए ऐसा नहीं होता है: जैसे मीटर संघों:

var Shop = sequelize.define('Shop', { 
    name: Sequelize.STRING, 
    address: Sequelize.STRING, 
    phone: Sequelize.STRING, 
    email: Sequelize.STRING, 
    percentage: Sequelize.FLOAT, 
    text: Sequelize.TEXT, 
    categories: Sequelize.TEXT, 
    start: Sequelize.DATE, 
    end: Sequelize.DATE 
}); 

var Offer = sequelize.define('Offer', { 
    name: Sequelize.STRING, 
    deadline: Sequelize.DATE, 
    optionDuration: Sequelize.INTEGER 
}); 

Shop.hasMany(Offer); 
Offer.belongsTo(Shop); 

यह केवल "आईडी" प्राथमिक कुंजी

मैं भी कुछ n के साथ दो तालिकाओं की दुकानों और प्रस्तावों, उन दोनों के बनाता है:

Group.hasMany(Accesslevel); 
Accesslevel.hasMany(Group); 

लेकिन इस मामले में, सीक्वेलिज़ बनाने वाली तालिका में, कोई विदेशी कुंजी नहीं है; इसलिए यदि मैं पूर्व के लिए हटा देता हूं। जुड़ने वाली तालिका accesslevelsgroups में संबंधित रिकॉर्ड्स की तुलना में एक acccesslevel हटा नहीं है।

क्या कोई जानता है कि मैं कुछ गलत कर रहा हूं या कुछ खो रहा हूं? क्या मैं जरूरत संघों के लिए सभी विदेशी कुंजी और संभावना व्यवहार 'onDelete' और 'onUpdate' (झरना)

निर्दिष्ट करने के लिए बनाने के लिए है - मैं क्रियान्वित सिंक के लिए एक मार्ग बना लिया है अद्यतन :

myServer.get('/sync', function (req, res) { 
    sequelize.sync({force: true}).success(function() { 
     console.log('sync done'); 
     res.send(200, 'sync done'); 
    }).error(function(error) { 
     console.log('there was a problem'); 
     res.send(200, 'there was a problem'); 
    }); 
}); 

तो फिर ब्राउज़र मैं 127.0.0.1:port/sync टाइप डाटाबेस संरचना

+0

sequelize का समर्थन नहीं करता विदेशी keys.You की जरूरत है। – mpm

+1

@mpm यह बेहद गलत है, http://sequelizejs.com/docs/1.7.8/associations#foreign-keys –

+0

@ विल्म डी'हाइस्लेयर अच्छी तरह से जब मैंने इसका इस्तेमाल किया, तो खुशी हुई कि अब यह समर्थित है। – mpm

उत्तर

1

आप (डेटाबेस में) तालिका बनाने के बाद संबंध जोड़ दिया बनाने के लिए?
यदि आप अपनी योजना को संशोधित करते हैं और अपना प्रोग्राम फिर से चलाते हैं तो आपको .sync({ force: true }) की आवश्यकता है। सीक्वेलिज़ केवल तालिका बनायेगा और इसके सभी संदर्भ होंगे यदि तालिका डेटाबेस में अभी तक मौजूद नहीं है।

क्या आप सभी संघों के बाद सिंक को कॉल कर रहे हैं?

क्या आप इनो डीबी का उपयोग कर रहे हैं?

विचित्र रूप से पर्याप्त है कि मैं इसे पुन: पेश कर सकता हूं, सबसे आसान फिक्स मैन्युअल रूप से कुंजी को परिभाषित करना है, इस तरह मैंने इसे हल किया है, मैं एक बग हो सकता हूं अन्यथा मुझे यकीन नहीं है।

यहाँ देखें: उन्हें स्वयं बनाते को http://sequelizejs.com/docs/latest/associations#block-3-line-24

+0

मैं पहले पोस्ट में लिखा गया मॉडल के ठीक बाद सभी संगठनों को परिभाषित करता हूं; तब मैंने सर्वर में एक मार्ग/सिंक बनाया है जिसने सिंक ({force: true}) निष्पादित किया है, और एक अन्य मार्ग/डमी-डेटा जो स्वचालित रूप से कुछ रिकॉर्ड डालता है; इसलिए मैं रन/सिंक और फिर/डमी-डेटा ... मैं इनो डीबी का उपयोग करता हूं ... –

+0

मैंने मार्ग के साथ प्रश्न अपडेट किया है ... –

+0

@CerealKiller मेरा अद्यतन उत्तर देखें –