Sequelize Unknown colonna "* .createdAt" in "field list"


102

Ricevo una colonna sconosciuta "userDetails.createdAt" in "field list" quando provo a recuperare con associazione.

L'uso findAllsenza associazione funziona bene.

Il mio codice è il seguente:

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

Risposte:


210

Penso che l'errore sia che hai i timestamp abilitati in sequelize, ma le tue definizioni di tabella effettive nel DB non contengono una colonna timestamp.

Quando esegui user.find, lo farà SELECT user.*, il che accetta solo le colonne che hai effettivamente. Ma quando ti unisci, ogni colonna della tabella unita avrà un alias, che crea la seguente query:

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

La soluzione sarebbe disabilitare i timestamp per il modello userDetails:

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

o per tutti i modelli:

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

1
questo non ha senso perché non è più così che appare un modello sequelize. dopo che l'elenco dei campi è class and instancemethods
Travis Delly

Questo è abbastanza fastidioso. Non avevo problemi, timestamps: falseera abbastanza, ma improvvisamente Sequelize ha aggiunto un` .createdAt` alla SELECT di una tabella specifica, in una colonna di chiave esterna. Poi ho dovuto includere define: { timestamps: false }nell'istanza Sequelize e ha funzionato per me.
Jeff Pal

9

Ho ricevuto lo stesso errore durante la migrazione del nostro progetto da laravel a featherjs. Le tabelle hanno nomi di colonna created_at, updated_at invece di createdat, updatedat. Ho dovuto utilizzare la mappatura del nome del campo nei modelli Sequelize come indicato di seguito

  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

Ho lo stesso errore, due soluzioni :

  1. quando crei la tabella, aggiungi le colonne created_at e 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. disabilita i timestamp
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })

1

Disabilita timestamp Es: -

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

0

beh, forse è troppo tardi ma puoi creare createdAt, updatedAt quando la migrazione piace

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

Sto usando express e sequelize mysql, quindi il modello definisce come normale per es:

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

Per postgresql:

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

Inutile dire che, sostituire user, pass, url, porte dbnamevalori con i valori di configurazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.