【问题标题】:Sequelize CLI & DB migrations with Typescript使用 Typescript 续集 CLI 和 DB 迁移
【发布时间】:2022-01-12 14:57:06
【问题描述】:

Sequelize 文档声称它可以与 Typescript 一起使用,但为了使其在生产中有用,需要使用 DB 迁移脚本。这些只能使用 Sequelize CLI 执行,但这个 CLI 似乎根本不考虑 Typescript。它只生成(并且显然运行)JS 文件。 NPM 上有一个“sequelize-cli-typescript”项目,但它已经 4 岁了! Stack Overflow 上对相关问题的唯一答案实际上是 6 个字长,没有一个有用:Using sequelize cli with typescript

我的设置是这样的:

我用 Typescript 和一个简单的 tsconfig.js 创建了一个基本的 Node 应用程序,如下所示:

{
  "compilerOptions": {
    "allowJs": true,
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": ".",
    "paths": {
      "*": [
        "node_modules/*"
      ]
    }
  },
  "include": [
    "*"
  ]
}

我也在使用 ESLint 和以下 .eslintrc:

{
  "root": true,
  "parser": "@typescript-eslint/parser",
  "plugins": [
    "@typescript-eslint"
  ],
  "extends": [
    "airbnb-base", "airbnb-typescript/base"
  ],
  "parserOptions": {
    "project": "./tsconfig.json"
  }
}

然后我尝试运行 Sequelize CLI init 命令 npx sequelize-cli init,如 DB 迁移文档中所述。这导致使用以下内容创建文件models/index.js

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

这会导致我的 IDE(VS 代码)显示错误:

解析错误:已为 @typescript-eslint/parser 设置了“parserOptions.project”。 该文件与您的项目配置不匹配:models/index.js。 该文件必须包含在至少一个提供的项目中。

我不知道这是什么意思。我已经阅读了许多解释,但没有一个对我有意义。我在 tsconfig 中将 allowJs 设置为 true 并包含所有内容。我错过了什么?更重要的是如何使用 Typescript 进行数据库迁移和 CLI 生成的代码?

【问题讨论】:

    标签: node.js typescript sequelize.js


    【解决方案1】:

    至于生成的用于连接数据库和注册模型的代码,您应该手动将其转换为 ts(通常是一次性的)。
    至于迁移,我使用以下解决方法:

    1. .sequelizerc 中的迁移路径配置到 TS 将放置已编译应用的文件夹中的子文件夹(这对于能够在测试和生产环境中应用迁移很重要),例如:
    const { resolve } = require('path');
    
    module.exports = {
        config: resolve('build/application/config.js'),
        'seeders-path': resolve('build/application/seeders'),
        'migrations-path': resolve('build/application/migrations'),
        'models-path': resolve('application/models')
    };
    
    1. 生成具有给定名称的迁移文件:
    sequelize migration:create --name add-some-table
    
    1. 将生成的文件移动到application/migrations,并将其扩展名更改为.ts
    2. 用某种迁移 Typescript-template 替换文件的内容:
    import { QueryInterface, DataTypes, QueryTypes } from 'sequelize';
    
    module.exports = {
        up: (queryInterface: QueryInterface): Promise<void> => queryInterface.sequelize.transaction(
            async (transaction) => {
              // here go all migration changes
            }
        ),
    
        down: (queryInterface: QueryInterface): Promise<void> => queryInterface.sequelize.transaction(
            async (transaction) => {
              // here go all migration undo changes
            }
        )
    };
    
    1. 为迁移文件添加必要的更改

    基本上,可以编写一些脚本文件来简单地生成.ts迁移文件,直接使用给定名称复制application/migrations文件夹中的预定义模板文件,以将步骤2-4合并为一个步骤。

    如果您最终想出更好的解决方案,请随时在 cmets 中分享,甚至在此处作为单独的答案。

    【讨论】:

    • 我收到一条错误消息“从 v4.0.0 开始,需要明确提供方言。”仅当我尝试运行迁移时才会发生这种情况。例如,使用 Model.sync() 它实际上可以工作并创建表,因此问题不在于配置。它说“加载的配置文件“dist\db\config.js”。”在错误之前。你有什么想法?仅在使用打字稿时发生
    • Sequelize CLI 似乎看不到它的配置文件,您应该在其中指示连接设置
    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多