'필드 목록'의 알 수없는 열 '* .createdAt'을 Sequelize


101

연관으로 가져 오려고 할 때 '필드 목록'에 알 수없는 열 'userDetails.createdAt'이 표시됩니다.

findAll연결없이 사용하면 잘 작동합니다.

내 코드는 다음과 같습니다.

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

답변:


209

오류는 sequelize에서 타임 스탬프를 활성화했지만 DB의 실제 테이블 정의에 타임 스탬프 열이 포함되어 있지 않다는 것입니다.

user.find를 수행 SELECT user.*하면 실제로 가지고있는 열만 사용하는. 그러나 조인하면 조인 된 테이블의 각 열에 별칭이 지정되어 다음 쿼리가 생성됩니다.

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

수정 사항은 userDetails 모델에 대한 타임 스탬프를 비활성화하는 것입니다.

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

또는 모든 모델 :

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

1
이것은 더 이상 속편 화 모델이 보이지 않기 때문에 의미가 없습니다. 필드 목록이 class 및 instancemethods 이후
Travis Delly

이것은 매우 성가신 일입니다. 나는 문제가 없었고 timestamps: false충분했지만 갑자기 Sequelize가 외래 키 열에서 특정 테이블의 SELECT에 '.createdAt'을 추가했습니다. 그런 다음 define: { timestamps: false }Sequelize 인스턴스화 에 포함해야했고 저에게 효과적이었습니다.
Jeff Pal

9

프로젝트를 laravel에서 featherjs로 마이그레이션 할 때 동일한 오류가 발생했습니다. 테이블에는 createdat, updatedat 대신 created_at, updated_at 컬럼 이름이 있습니다. 아래에 주어진대로 Sequelize 모델에서 필드 이름 매핑을 사용해야했습니다.

  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

동일한 오류가 발생했습니다. 두 가지 해결책 :

  1. 테이블 생성시 created_at 및 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. 타임 스탬프 비활성화
const Project = sequelize.define('project', {
   title: Sequelize.STRING,
   description: Sequelize.TEXT
 },{
   timestamps: false
 })

1

타임 스탬프 비활성화 예 :-

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

0

글쎄, 너무 늦었을 수도 있지만 마이그레이션과 같은 경우 createdAt, updatedAt을 만들 수 있습니다.

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

나는 express와 sequelize mysql을 사용하고 모델은 예를 들어 평상시처럼 정의합니다.

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

postgresql의 경우 :

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

대체, 말할 필요도없이 user, pass, url, portdbname구성 값 값.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.