You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sequelize-typescript时遇SQLITE_ERROR: no such table: Users问题求助

问题:sequelize-typescript 提示 SQLITE_ERROR: no such table: Users

在依赖注入风格的Express.js REST API中使用sequelize-typescript时,出现错误:

Error occured due to SQLITE_ERROR: no such table: Users

以下是相关代码:

实体文件 user.ts

export class User extends Model {
@PrimaryKey
@Column({
    type: DataType.INTEGER,
    autoIncrement: true
})
declare userId: number

@Column({
    type: DataType.STRING
})
declare firstName : string;

@Column({
    type: DataType.STRING
})
declare lastName: string;

@Column({
    type: DataType.STRING
})
declare email: string;

@Column({
    type: DataType.STRING
})
declare phone: string;
}

数据库中间件代码

export default class DatabaseMiddleware {
private databaseInstance : Sequelize;

constructor() {
    this.databaseInstance = new Sequelize({
        database: process.env.MAMLAKHA_DATABASE_NAME,
        dialect: "sqlite",
        host: process.env.MAMLAKHA_DATABASE_HOST,
        username: process.env.MAMLAKHA_DATABASE_USERNAME,
        password: process.env.MAMLAKHA_DATABASE_PASSWORD,
        // storage: process.env.MAMLAKHA_DATABASE_STORAGE_PATH,
        logging(sql, timing) {
            console.log("The SQL statement from Sequelize executed is", sql, timing);
        },
        models: [User],
        repositoryMode: true
    });
}

public async connectToDatabase() {
    try {
        await this.databaseInstance.authenticate();
        if(process.env.ENVIRONMENT_PROFILE === "development") {
            await this.databaseInstance.sync({ alter: true });
        }

        console.log("Connection to database has been established successfully");
    } catch(error) {
        console.error("Unable to connect to database due to", error);
    }
}

public getDatabaseInstance() {
    return this.databaseInstance;
}
}

REST API启动主代码

class App {
private baseDirectory : string;
private expressApp : Express

// Middleware Instances
private databaseMiddleware : DatabaseMiddleware;

constructor() {
    dotenv.config({ path: "./.env.development" });
    this.baseDirectory = __dirname;
    this.expressApp = express();
    routingContainer(Container);

    useExpressServer(this.expressApp, {
        routePrefix: process.env.MAMLAKHA_ROUTE_PREFIX,
        defaultErrorHandler: false,
        controllers: [this.baseDirectory + `/**/controllers/*.ts`]
    });

    this.expressApp.use(bodyParser.urlencoded({ extended: false }));
    this.expressApp.use(bodyParser.json());

    this.databaseMiddleware = new DatabaseMiddleware();
}

run() {
    this.expressApp.listen(process.env.MAMLAKHA_REST_API_PORT, () => {
        console.info(`Hello there, it's Mamlakha app and it's running on port ${process.env.MAMLAKHA_REST_API_PORT} 🤘`);
    });

    this.databaseMiddleware.connectToDatabase();
}

get expressAppInstance() : Express {
    return this.expressApp;
}
}
const main : App = new App(); main.run();

解决方案

1. 给实体类添加@Table装饰器

sequelize-typescript需要通过@Table装饰器识别实体对应的数据库表,否则sync操作不会创建表。修改user.ts:

import { Model, Table, PrimaryKey, Column, DataType } from 'sequelize-typescript';

@Table
export class User extends Model {
  // ... 原有字段定义
}

2. 启用SQLite存储路径配置

SQLite默认使用内存数据库,重启后数据和表会丢失。取消storage配置的注释,并确保.env文件中配置了正确的存储路径(比如./database.sqlite):

this.databaseInstance = new Sequelize({
    // ... 其他配置
    storage: process.env.MAMLAKHA_DATABASE_STORAGE_PATH,
    // ... 其他配置
});

3. 确保数据库初始化完成后再启动服务

当前代码先启动Express服务再初始化数据库,可能导致控制器在表创建前发起查询。修改App的run方法:

async run() {
    try {
        await this.databaseMiddleware.connectToDatabase();
        this.expressApp.listen(process.env.MAMLAKHA_REST_API_PORT, () => {
            console.info(`Hello there, it's Mamlakha app and it's running on port ${process.env.MAMLAKHA_REST_API_PORT} 🤘`);
        });
    } catch (error) {
        console.error("Failed to start app due to database connection issue:", error);
    }
}

4. 检查环境变量配置

确认.env.development中的ENVIRONMENT_PROFILE值为development,否则不会执行sync({ alter: true })创建表。

5. 手动指定表名(可选)

如果sequelize自动生成的表名不符合预期,可以在@Table装饰器中明确指定:

@Table({ tableName: 'Users' })
export class User extends Model {
  // ... 原有字段定义
}

内容的提问来源于stack exchange,提问作者Adrian Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:38:13