'फ़ील्ड सूची' में अज्ञात कॉलम '* .createdAt' को अनुक्रमित करें


101

मुझे 'फ़ील्ड सूची' में एक अज्ञात कॉलम 'userDetails.createdAt' मिल रहा है, जब एसोसिएशन के साथ लाने की कोशिश की जा रही है।

findAllबिना संघ के उपयोग ठीक काम करता है।

मेरा कोड इस प्रकार है:

var userDetails = sequelize.define('userDetails', {
    userId :Sequelize.INTEGER,
    firstName : Sequelize.STRING,
    lastName : Sequelize.STRING,
    birthday : Sequelize.DATE
});

var user = sequelize.define('user', {
    email: Sequelize.STRING,
    password: Sequelize.STRING
});

user.hasOne(userDetails, {foreignKey: 'userId'});

user.findAll({include: [userDetails] }).success(function(user) {
    console.log(user)
});

जवाबों:


208

मुझे लगता है कि त्रुटि यह है कि आपने टाइमस्टैम्प को सीक्वल करने में सक्षम किया है, लेकिन डीबी में आपकी वास्तविक तालिका परिभाषा में टाइमस्टैम्प कॉलम नहीं है।

जब आप user.find करते हैं SELECT user.*, तो यह सिर्फ वह करेगा , जो केवल आपके पास मौजूद कॉलम लेता है। लेकिन जब आप शामिल होते हैं, तो शामिल की गई तालिका के प्रत्येक स्तंभ को अलियास किया जाएगा, जो निम्नलिखित प्रश्न बनाता है:

SELECT `users`.*, `userDetails`.`userId` AS `userDetails.userId`,`userDetails`.`firstName` AS `userDetails.firstName`,`userDetails`.`lastName` AS `userDetails.lastName`, `userDetails`.`birthday` AS `userDetails.birthday`, `userDetails`.`id` AS `userDetails.id`, `userDetails`.`createdAt` AS `userDetails.createdAt`, `userDetails`.`updatedAt` AS `userDetails.updatedAt` FROM `users` LEFT OUTER JOIN `userDetails` AS `userDetails` ON `users`.`id` = `userDetails`.`userId`;

फिक्स टाइमस्टैम्प को या तो यूजरडेल्स मॉडल के लिए निष्क्रिय करना होगा:

var userDetails = sequelize.define('userDetails', {
    userId :Sequelize.INTEGER,
    firstName : Sequelize.STRING,
    lastName : Sequelize.STRING,
    birthday : Sequelize.DATE
}, {
    timestamps: false
});

या सभी मॉडलों के लिए:

var sequelize = new Sequelize('sequelize_test', 'root', null, {
    host: "127.0.0.1",
    dialect: 'mysql',
    define: {
        timestamps: false
    }
});

1
यह समझ में नहीं आता क्योंकि न कि कैसे एक अगली कड़ी मॉडल अब दिखता है। क्षेत्र सूची के बाद वर्ग और उदाहरण के लिए है
ट्रैविस डेल्ली

यह काफी कष्टप्रद है। मुझे कोई समस्या नहीं हो रही थी, timestamps: falseपर्याप्त था, लेकिन अचानक सीक्लाइज़ ने एक विदेशी तालिका के कॉलम में एक विशिष्ट तालिका के चयन के लिए एक `.createdAt` जोड़ा। तब मुझे define: { timestamps: false }सीक्वेलाइज इंस्टेंटिएशन में शामिल करने की जरूरत थी और यह मेरे लिए काम कर गया।
जेफ पाल

8

मुझे एक ही त्रुटि मिली जब लारवेल से पंखों तक हमारी परियोजना को स्थानांतरित करना। टेबल्स में कॉलम नाम बनाया गया है। मुझे नीचे दिए गए अनुसार Sequelize मॉडल में फ़ील्ड नाम मैपिंग का उपयोग करना था

  const users = sequelize.define('users', {
     id: {
         type: Sequelize.INTEGER,
         primaryKey: true
     },
     createdAt: {
         field: 'created_at',
         type: Sequelize.DATE,
     },
     updatedAt: {
         field: 'updated_at',
         type: Sequelize.DATE,
     },
     ..
     ..
     ..
     ..

3

मुझे एक ही त्रुटि मिली, दो समाधान two

  1. तालिका बनाते समय, create_at और updated_at कॉलम जोड़ें।
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
  `name` varchar(30) DEFAULT NULL COMMENT 'user name',
  `created_at` datetime DEFAULT NULL COMMENT 'created time',
  `updated_at` datetime DEFAULT NULL COMMENT 'updated time',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='user';
  1. टाइमस्टैम्प को निष्क्रिय करें
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })

1

टाइमस्टैम्प को अक्षम करें: -

const User = sequelize.define('user', {
    firstName : Sequelize.STRING,
    lastName : Sequelize.STRING,
}, {
    timestamps: false
});

0

ठीक है, हो सकता है बहुत देर हो गई हो, लेकिन जब माइग्रेशन पसंद हो तो आप createAt, updatedAt बना सकते हैं

      createdAt: {
        allowNull: false,
        defaultValue: Sequelize.fn('now'),
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        defaultValue: Sequelize.fn('now'),
        type: Sequelize.DATE
      }

Im का उपयोग करते हुए एक्सप्रेस और सीक्वल mysql तो मॉडल पूर्व के लिए सामान्य की तरह परिभाषित:

module.exports = (sequelize, DataTypes) => {
  const Customer = sequelize.define('customer', {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    phone: DataTypes.TEXT,
    consider: DataTypes.TEXT,
    otherQuestion: DataTypes.TEXT
  }, {})
  return Customer

0

Postgresql के लिए:

const sequelize = new Sequelize('postgres://user:pass@url:port/dbname',{ 
    define:{
        timestamps: false
    }
})

कहते हैं, की जगह जरूरत नहीं user, pass, url, portऔर dbnameआपके विन्यास मूल्यों के साथ मूल्यों।

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