Unbekannte Spalte '* .createdAt' in 'Feldliste' fortsetzen


101

Ich erhalte eine unbekannte Spalte 'userDetails.createdAt' in 'Feldliste', wenn versucht wird, mit Zuordnung abzurufen.

Die Verwendung findAllohne Zuordnung funktioniert einwandfrei.

Mein Code lautet wie folgt:

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

Antworten:


208

Ich denke, der Fehler ist, dass Sie Zeitstempel in der Folge aktiviert haben, aber Ihre tatsächlichen Tabellendefinitionen in der DB keine Zeitstempelspalte enthalten.

Wenn Sie user.find ausführen, wird dies nur ausgeführt SELECT user.*, wobei nur die Spalten verwendet werden, die Sie tatsächlich haben. Wenn Sie jedoch beitreten, wird jede Spalte der verknüpften Tabelle mit einem Alias ​​versehen, wodurch die folgende Abfrage erstellt wird:

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

Die Lösung besteht darin, Zeitstempel für das userDetails-Modell zu deaktivieren:

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

oder für alle Modelle:

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

1
Das macht keinen Sinn, weil so ein Sequelize-Modell nicht mehr so ​​aussieht. nach der Feldliste ist Klasse und Instanzmethoden
Travis Delly

Das ist ziemlich nervig. Ich hatte kein Problem, timestamps: falsewar genug, aber plötzlich fügte das Sequelize dem SELECT einer bestimmten Tabelle in einer Fremdschlüsselspalte ein ".createdAt" hinzu. Dann musste ich define: { timestamps: false }in die Sequelize-Instanziierung aufnehmen und es funktionierte für mich.
Jeff Pal

8

Ich habe den gleichen Fehler bei der Migration unseres Projekts von Laravel auf Featherjs erhalten. Tabellen haben Spaltennamen created_at, updated_at anstelle von createdat, updatedat. Ich musste die Feldnamenzuordnung in Sequelize-Modellen wie unten angegeben verwenden

  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

Ich habe den gleichen Fehler, zwei Lösungen:

  1. Fügen Sie beim Erstellen einer Tabelle die Spalten created_at und updated_at hinzu.
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. Zeitstempel deaktivieren
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })

1

Zeitstempel deaktivieren Beispiel: -

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

0

Nun, vielleicht zu spät, aber Sie können createAt erstellen, aktualisiertAt, wenn Migration wie

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

Ich benutze Express und folge MySQL, dann definiere das Modell wie gewohnt, zum Beispiel:

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

Für postgresql:

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

Unnötig zu sagen, ersetzen user, pass, url, portund dbnameWerte mit Ihrem Konfigurationswert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.