Urutkan kolom Tidak Dikenal '* .createdAt' dalam 'daftar bidang'


102

Saya mendapatkan kolom Tidak Dikenal 'userDetails.createdAt' dalam 'daftar bidang' Saat mencoba mengambil dengan pengaitan.

Menggunakan findAlltanpa asosiasi berfungsi dengan baik.

Kode saya adalah sebagai berikut:

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

Jawaban:


210

Saya pikir kesalahannya adalah Anda mengaktifkan stempel waktu secara sekuel, tetapi definisi tabel Anda yang sebenarnya di DB tidak berisi kolom stempel waktu.

Ketika Anda melakukan user.find itu hanya akan dilakukan SELECT user.*, yang hanya mengambil kolom yang Anda miliki. Namun saat Anda bergabung, setiap kolom dari tabel yang digabungkan akan diberi alias, yang membuat kueri berikut:

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

Perbaikannya adalah menonaktifkan stempel waktu untuk model userDetails:

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

atau untuk semua model:

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

1
ini tidak masuk akal karena bukan seperti itu lagi tampilan model sekuel. setelah daftar lapangan adalah class dan instancemethods
Travis Delly

Ini cukup mengganggu. Saya tidak mengalami masalah, timestamps: falsesudah cukup, tetapi tiba-tiba Sequelize menambahkan` .createdAt` ke SELECT dari tabel tertentu, di kolom kunci asing. Kemudian saya perlu memasukkannya ke define: { timestamps: false }dalam Sequelize instantiation dan itu berhasil untuk saya.
Jeff Pal

9

Saya mendapat kesalahan yang sama saat memigrasi proyek kami dari laravel ke featherjs. Tabel memiliki nama kolom create_at, updated_at, bukan createat, updatedat. Saya harus menggunakan pemetaan nama bidang dalam model Sequelize seperti yang diberikan di bawah ini

  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

Saya mendapat kesalahan yang sama, dua solusi :

  1. saat membuat tabel, tambahkan kolom create_at dan 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. nonaktifkan cap waktu
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })

1

Nonaktifkan cap waktu Contoh: -

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

0

baik, mungkin terlambat tetapi Anda dapat membuat createAt, updatedAt saat migrasi suka

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

Saya menggunakan express dan sequelize mysql maka modelnya hanya mendefinisikan seperti biasa untuk mis:

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

Untuk postgresql:

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

Tak perlu dikatakan, menggantikan user, pass, url, portdan dbnamenilai-nilai dengan nilai konfigurasi Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.