web-dev-qa-db-fra.com

Séquencer la colonne inconnue '* .createdAt' dans la 'liste de champs'

Je reçois une colonne inconnue 'userDetails.createdAt' dans 'liste de champs' Lorsque j'essaie d'extraire avec association.

Utiliser findAll sans association fonctionne bien.

Mon code est le suivant:

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)
});
68
David Limkys

Je pense que l'erreur est que vous avez activé les horodatages dans Sequelize, mais vos définitions de table réelles dans la base de données ne contiennent pas de colonne d'horodatage.

Lorsque vous exécutez user.find, il ne fera que SELECT user.*, qui ne prend que les colonnes que vous avez réellement. Mais lorsque vous vous joignez, chaque colonne de la table jointe sera associée à un alias, ce qui crée la requête suivante:

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

Le correctif consisterait à désactiver les horodatages pour le modèle userDetails:

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

ou pour tous les modèles:

var sequelize = new Sequelize('sequelize_test', 'root', null, {
    Host: "127.0.0.1",
    dialect: 'mysql',
    define: {
        timestamps: false
    }
});
146
Jan Aagaard Meier

J'ai eu la même erreur lors de la migration de notre projet de laravel à featherjs. Les tables ont des noms de colonne created_at, updated_at au lieu de createdat, updatedat. J'ai dû utiliser la correspondance de nom de champ dans les modèles Sequelize comme indiqué ci-dessous

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

J'ai eu la même erreur, deux solutions:

  1. lors de la création de la table, ajoutez les colonnes created_at et 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. désactiver les horodatages

const Proje

ct = sequelize.define('project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
},{
    timestamps: false
})
0
zhuxy