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;};使用 Sequelize CLI 生成播种文件模板,文件名格式为 YYYYMMDDHHmmss-add-static-task-types.js:
npx sequelize-cli seed:generate --name add-static-task-types编辑播种文件,使用 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时间字段为空错误:
错误示例:null value in column "createdAt" violates not-null constraint。
解决方案:确保播种数据中包含 createdAt 和 updatedAt 字段。
表名或字段名不匹配:
错误示例:relation "static_task_types" does not exist。
解决方案:检查模型定义和播种文件中的表名是否一致(默认复数形式,如 static_task_types)。
主键冲突:
错误示例:duplicate key value violates unique constraint "static_task_types_pkey"。
解决方案:在 down 方法中设置 restartIdentity: true 重置自增计数器,或手动指定唯一 ID。
通过以上步骤,可高效实现 Sequelize 静态数据播种,为应用程序提供预置数据支持。