सीक्वल को एकल सारणी के नामों का उपयोग कैसे करें


109

मेरे पास एक मॉडल है जिसे उपयोगकर्ता कहा जाता है, लेकिन सीक्वेलाइज़ तालिका USERS के लिए देखता है जब भी मैं DB में सहेजने की कोशिश कर रहा हूं। क्या किसी को पता है कि एकल तालिका नामों का उपयोग करने के लिए Sequelize कैसे सेट करें? धन्यवाद।


3
userएक आरक्षित शब्द है, आपके पास समस्याओं का भार होगा यदि आप वास्तव में उस नाम के साथ एक तालिका बनाने की कोशिश करते हैं।
a_horse_with_no_name

1
userएक आरक्षित शब्द नहीं है, बल्कि एक कीवर्ड है। जब आप इसका उपयोग करके किसी समस्या का सामना नहीं करेंगे, तो इससे बचना अच्छा है। dev.mysql.com/doc/refman/5.5/en/keywords.html
निर्मल

जवाबों:


224

डॉक्स राज्य है कि आप संपत्ति का उपयोग कर सकते freezeTableName

कृपया इस उदाहरण पर एक नज़र डालें:

var Bar = sequelize.define('Bar', { /* bla */ }, {
  // don't add the timestamp attributes (updatedAt, createdAt)
  timestamps: false,

  // don't delete database entries but set the newly added attribute deletedAt
  // to the current date (when deletion was done). paranoid will only work if
  // timestamps are enabled
  paranoid: true,

  // don't use camelcase for automatically added attributes but underscore style
  // so updatedAt will be updated_at
  underscored: true,

  // disable the modification of tablenames; By default, sequelize will automatically
  // transform all passed model names (first parameter of define) into plural.
  // if you don't want that, set the following
  freezeTableName: true,

  // define the table's name
  tableName: 'my_very_custom_table_name'
})

2
मैंने आपके प्रश्न के लिंक को अपडेट कर दिया है क्योंकि यह टूट गया था, आशा है कि आप बुरा नहीं मानेंगे!
मारिया इनेस परनिरी

1
freezeTableName: trueसीक्वल के नवीनतम संस्करण में काम नहीं कर रहा है। कोई और उपाय?
मुहम्मद यासिर

2
एक नकारात्मक पक्ष freezeTableNameयह है कि यह लोअरकेसिंग टेबल और कॉलम नामों से भी sqlz को रोकता है। जिसका अर्थ है कि बाद में, जब आप डेटा के माध्यम से खोदने के लिए SQL लिख रहे हों, तो आपको मिश्रित-मामले के नामों (जो भी आपकी बोली के लिए होता है) के साथ सामना करना होगा। पीजी पर, इसका मतलब है कि हर मिश्रित-मामले के नाम के आसपास दोहरे-उद्धरणों का उपयोग करना - yuk! काश हम बहुवचन का ऑप्ट-आउट कर सकते, लेकिन केस-फोल्डिंग को बरकरार रख सकते ... defineमें tableNameस्पष्ट ओवरराइड का विकल्प है।
टॉम

1
का उपयोग freezeTableName: trueके अलावाmodelName: 'singularName'
Naor लेवी

97

जबकि स्वीकृत उत्तर सही है, आप इसे एक बार करने के बजाय सभी तालिकाओं के लिए एक बार कर सकते हैं। आप बस एक समान विकल्प ऑब्जेक्ट को Sequelize constructor में पास करते हैं, जैसे:

var Sequelize = require('sequelize');

//database wide options
var opts = {
    define: {
        //prevent sequelize from pluralizing table names
        freezeTableName: true
    }
}

var sequelize = new Sequelize('mysql://root:123abc@localhost:3306/mydatabase', opts)

अब जब आप अपनी संस्थाओं को परिभाषित करते हैं, तो आपको निर्दिष्ट करने की आवश्यकता नहीं है freezeTableName: true:

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})

3
हेड-अप के लिए धन्यवाद, यहां उन लोगों के लिए प्रलेखन के लिए लिंक है जो रुचि रखते हैं।
ओज़नम्यूज़

0

यदि आपको सिंगुर और बहुवचन परिभाषाओं के लिए अलग-अलग मॉडल नाम रखने की आवश्यकता है, तो आप मॉडल के विकल्पों में एक पैरामीटर के रूप में नाम पारित कर सकते हैं।

कृपया इस उदाहरण पर एक नज़र डालें:

    const People = sequelize.define('people', {
    name: DataTypes.STRING,
}, {
    hooks: {
        beforeCount (options) {
            options.raw = true;
        }
    },
    tableName: 'people',
    name: {
        singular: 'person',
        plural: 'people'
    }
});

यह "व्यक्ति" को एक ऑब्जेक्ट के रूप में लौटाएगा जब एक एकल रिकॉर्ड को क्वियर किया जा रहा है और "लोग" एक सरणी के रूप में जब हम कई रिकॉर्ड प्राप्त करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.