Bilinmeyen '* .createdAt' sütununu 'alan listesi'nde devam ettirin


104

İlişkilendirmeyle getirmeye çalışırken 'alan listesi' içinde Bilinmeyen bir sütun 'userDetails.createdAt' alıyorum.

findAllİlişkilendirme olmadan kullanmak iyi çalışıyor.

Kodum aşağıdaki gibidir:

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)
});

Yanıtlar:


217

Sanırım hata, sıralı hale getirmede etkin zaman damgalarına sahip olmanızdır, ancak DB'deki gerçek tablo tanımlarınız bir zaman damgası sütunu içermiyor.

User.find'i yaptığınızda sadece işe yarar, bu da sadece sahip olduğunuz SELECT user.*sütunları alır. Ancak katıldığınızda, birleştirilen tablonun her sütununa takma ad verilir ve bu da aşağıdaki sorguyu oluşturur:

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`;

Düzeltme, userDetails modellerinden biri için zaman damgalarını devre dışı bırakmak olacaktır:

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

veya tüm modeller için:

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

1
bu bir anlam ifade etmiyor, çünkü artık bir ardışık model böyle görünmüyor. alan listesinden sonra sınıf ve örnek yöntemler
Travis Delly

Bu oldukça can sıkıcı. Hiç sorun timestamps: falseyaşamıyordum, yeterliydi, ama birden bire Sequelize, yabancı anahtar sütununda belirli bir tablonun SELECT kısmına bir ".createdAt" ekledi. Sonra define: { timestamps: false }Sequelize örneğine dahil etmem gerekti ve bu benim için işe yaradı.
Jeff Pal

10

Projemizi laravel'den featherjs'e geçirirken aynı hatayı aldım. Tablolar, createdat, updatedat yerine created_at, updated_at sütun adlarına sahiptir. Sequelize modellerinde aşağıda verildiği gibi alan adı eşlemesini kullanmak zorunda kaldım

  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,
     },
     ..
     ..
     ..
     ..

field: 'updated_at',ihtiyacım olan şey, teşekkürler.
Ayoub Laazazi

3

Aynı hatayı aldım, iki çözüm :

  1. tablo oluştururken, created_at ve updated_at sütunlarını ekleyin.
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. zaman damgalarını devre dışı bırak
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })


1

Zaman damgalarını devre dışı bırak Örn: -

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

1

iyi, belki çok geç olabilir, ancak oluşturulmuşAt, updatedAt yaratabilirsiniz.

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

Mysql'i ifade ve devam ettirme kullanıyorum, sonra model sadece normal gibi tanımlıyor örneğin:

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 için:

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

Yerine, Söylemeye gerek yok user, pass, url, portve dbnameyapılandırma değerleri ile değerler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.