在"字段列表"中查询未知列'*.createdAt'

Dav*_*kys 83 node.js sequelize.js

我在'字段列表'中收到一个未知列'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)
});
Run Code Online (Sandbox Code Playgroud)

Jan*_*ier 174

我认为错误是你在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`;
Run Code Online (Sandbox Code Playgroud)

修复方法是禁用userDetails模型的时间戳:

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

或适用于所有型号:

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


zhu*_*uxy 9

我遇到了同样的错误,两个解决方案\xef\xbc\x9a

\n\n
    \n
  1. 创建表时,添加created_at和updated_at列。
  2. \n
\n\n
CREATE TABLE `users` (\n  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT \'primary key\',\n  `name` varchar(30) DEFAULT NULL COMMENT \'user name\',\n  `created_at` datetime DEFAULT NULL COMMENT \'created time\',\n  `updated_at` datetime DEFAULT NULL COMMENT \'updated time\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=\'user\';\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 禁用时间戳
  2. \n
\n\n
const Project = sequelize.define(\'project\', {\n   title: Sequelize.STRING,\n   description: Sequelize.TEXT\n },{\n   timestamps: false\n })\n\n
Run Code Online (Sandbox Code Playgroud)\n


Paw*_*wel 8

在一般配置中,这有帮助:

{
  timestamps: true,
}
Run Code Online (Sandbox Code Playgroud)

{
  timestamps: true,
  underscored: true,
}
Run Code Online (Sandbox Code Playgroud)


小智 5

从laravel迁移到featherjs时,我遇到了同样的错误。表具有列名created_at,updated_at而不是createdat,updatedat。我不得不在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,
     },
     ..
     ..
     ..
     ..
Run Code Online (Sandbox Code Playgroud)


Pra*_*iya 5

对于 PostgreSQL:

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

不用说,将userpassurlport值替换dbname为您的配置值。