Sequelize Unknown colonne '* .createdAt' dans 'field list'


101

J'obtiens une colonne inconnue 'userDetails.createdAt' dans 'liste de champs' lorsque j'essaie de récupérer avec association.

L'utilisation findAllsans association fonctionne très 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)
});

Réponses:


208

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 faites user.find, il le fera SELECT user.*, ce qui ne prend que les colonnes que vous avez réellement. Mais lorsque vous rejoignez, chaque colonne de la table jointe aura 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 serait de 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
    }
});

1
cela n'a pas de sens car ce n'est plus à quoi ressemble un modèle de séquelle. après la liste des champs est class and instancemethods
Travis Delly

C'est assez ennuyeux. Je n'avais aucun problème, timestamps: falsec'était assez, mais tout à coup, Sequelize a ajouté un `.createdAt` au SELECT d'une table spécifique, dans une colonne de clé étrangère. Ensuite, j'ai eu besoin d'inclure define: { timestamps: false }dans l'instanciation Sequelize et cela a fonctionné pour moi.
Jeff Pal le

8

J'ai eu la même erreur lors de la migration de notre projet de laravel vers featherjs. Les tables ont des noms de colonne created_at, updated_at au lieu de createdat, updatedat. J'ai dû utiliser le mappage 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,
     },
     ..
     ..
     ..
     ..

3

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 Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })

1

Désactiver les horodatages Ex: -

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

0

Eh bien, peut-être trop tard, mais vous pouvez créer createdAt, updatedAt lors de la migration comme

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

J'utilise express et séquelle mysql, puis le modèle définit simplement comme normal par exemple:

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

Pour postgresql:

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

Inutile de dire, remplacer user, pass, url, portet les dbnamevaleurs avec vos valeurs de configuration.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.