静态数据的 Sequelize 播种器

静态数据的 Sequelize 播种器
最新回答
思檀郎

2026-04-16 05:38:15

静态数据的 Sequelize 播种器是通过生成并执行播种文件,向数据库中插入预定义的静态数据,以避免手动创建。 以下是具体实现步骤和关键注意事项:

一、定义数据模型

需先在 Sequelize 中定义包含静态数据的模型,例如任务类型表 static_task_type:

module.exports = (sequelize, DataTypes) => { const static_task_type = sequelize.define("static_task_type", { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, task_type: { type: DataTypes.STRING, allowNull: false } }); return static_task_type;};
  • 关键字段:id(主键自增)、task_type(非空字符串)。
  • 注意:模型定义中无需包含 createdAt 和 updatedAt,但播种数据时需显式插入。
二、生成播种模板

使用 Sequelize CLI 生成播种文件模板,文件名格式为 YYYYMMDDHHmmss-add-static-task-types.js:

npx sequelize-cli seed:generate --name add-static-task-types
  • 作用:自动创建包含 up(插入数据)和 down(回滚数据)方法的模板文件。
三、填充播种数据

编辑播种文件,使用 queryInterface.bulkInsert 插入静态数据,示例如下:

'use strict';module.exports = { async up(queryInterface, Sequelize) { await queryInterface.bulkInsert('static_task_types', [ { id: 1, task_type: 'deep', createdAt: new Date(), updatedAt: new Date() }, { id: 2, task_type: 'shallow', createdAt: new Date(), updatedAt: new Date() }, { id: 3, task_type: 'phone call', createdAt: new Date(), updatedAt: new Date() }, { id: 4, task_type: 'errands', createdAt: new Date(), updatedAt: new Date() } ]); }, async down(queryInterface, Sequelize) { await queryInterface.bulkDelete('static_task_types', null, { truncate: true, cascade: true, restartIdentity: true }); }};
  • 关键点:

    时间字段:必须显式设置 createdAt 和 updatedAt,否则会违反非空约束。

    数据格式:日期需使用 new Date() 或 Sequelize.literal('CURRENT_TIMESTAMP')。

    回滚逻辑:down 方法中 truncate: true 会清空表并重置自增计数器。

四、执行播种

运行以下命令执行所有播种文件,或指定单个文件:

# 执行所有播种文件npx sequelize-cli db:seed:all# 执行单个播种文件npx sequelize-cli db:seed --seed path/to/seed-file.js
  • 验证结果:通过数据库工具(如 DBeaver)检查数据是否成功插入。
五、常见错误处理
  1. 时间字段为空错误:

    错误示例:null value in column "createdAt" violates not-null constraint。

    解决方案:确保播种数据中包含 createdAt 和 updatedAt 字段。

  2. 表名或字段名不匹配:

    错误示例:relation "static_task_types" does not exist。

    解决方案:检查模型定义和播种文件中的表名是否一致(默认复数形式,如 static_task_types)。

  3. 主键冲突:

    错误示例:duplicate key value violates unique constraint "static_task_types_pkey"。

    解决方案:在 down 方法中设置 restartIdentity: true 重置自增计数器,或手动指定唯一 ID。

六、最佳实践
  1. 版本控制:将播种文件纳入版本控制,确保团队环境一致性。
  2. 数据分类:按功能模块拆分播种文件(如 add-users.js、add-products.js),便于管理。
  3. 环境隔离:通过 sequelize.config.json 配置不同环境的数据库连接,避免生产环境误操作。

通过以上步骤,可高效实现 Sequelize 静态数据播种,为应用程序提供预置数据支持。