Sequelize TypeScript中findAll()报错:SQLITE_ERROR: no such column: NaN
Sequelize + SQLite调用findAll()出现SQLITE_ERROR: no such column: NaN
问题原因
你的Video模型类中,给多个属性直接设置了默认值(比如videoId: number = 0;、readonly createdAt: Date = new Date();等),sequelize-typescript会将这些类属性的默认值解析为数据库列的默认值配置。但对于createdAt这类由timestamps自动管理的字段,以及未在initialize方法中定义的version属性,这种手动赋值会导致Sequelize生成错误的SQL语句,最终触发no such column: NaN的异常。
修复方案
移除类中所有属性的默认值赋值,仅保留类型声明;自动生成的时间戳字段无需手动赋值;若需要version字段,需在initialize中补充配置。
修改后的Video模型代码
import { Model } from "sequelize-typescript"; import { DataTypes } from "sequelize"; import { DatabaseConnection } from "../app/database/databaseConnection"; export default class Video extends Model { // 仅保留类型声明,移除默认值赋值 videoId!: number; name!: string; date!: Date; title!: string; description!: string; resolution!: string; // 自动生成的时间戳字段,仅声明类型 readonly createdAt!: Date; readonly updatedAt!: Date; readonly deletedAt!: Date; // 若需要version字段,需在initialize中配置,否则删除该声明 // version!: number; } Video.initialize({ videoId: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true, allowNull: false }, name: { type: DataTypes.STRING, allowNull: false, }, date: { type: DataTypes.DATE, allowNull: false, }, title: { type: DataTypes.STRING, allowNull: false, }, description: { type: DataTypes.TEXT, allowNull: false, }, resolution: { type: DataTypes.STRING, allowNull: false, }, // 若需要version字段,添加以下配置 // version: { // type: DataTypes.INTEGER, // allowNull: false, // defaultValue: 0 // } }, { timestamps: true, sequelize: DatabaseConnection, paranoid: true });
说明
- 使用
!非空断言是为了告诉TypeScript,这些属性会由Sequelize自动初始化,避免类型检查报错。 createdAt、updatedAt、deletedAt由timestamps和paranoid配置自动生成,无需手动赋值或在initialize中定义。- 如果确实需要
version字段,必须在initialize方法中添加对应的列配置,否则不要在类中声明该属性。
内容的提问来源于stack exchange,提问作者Adrian Joseph
相关产品推荐
相关产品推荐

