如何使用续集迁移/种子插入初始数据?

Posted

技术标签:

【中文标题】如何使用续集迁移/种子插入初始数据?【英文标题】:How to insert initial data using sequelize migrations/seeds? 【发布时间】:2016-01-24 06:01:13 【问题描述】:

我正在尝试创建初始迁移以填充测试数据库,但我无法使其正常工作。这就是我在迁移中所拥有的:

'use strict';

module.exports = 
  up: function (queryInterface, Sequelize) 
    return [
      queryInterface.bulkInsert('Users', [
         username: "user1" ,
         username: "user2" 
    ])];
  ,

  down: function (queryInterface, Sequelize) 
    return queryInterface.dropTable('Users');
  
;

我得到这个错误:

== 20151024144833-create-conjugation: migrating =======
 [SequelizeUniqueConstraintError: Validation error]
  name: 'SequelizeUniqueConstraintError',
  message: 'Validation error',
  errors: [],
  fields: [] 

必须有更简单的方法来做到这一点。我检查了其他 SO 问题,但在当前版本的 sequelize 中语法发生了变化。

更新

好的,我意识到我的错误:我假设 sequelize 会处理时间戳。这解决了问题:

up: function (queryInterface, Sequelize) 
  console.log(User);
  return [
    queryInterface.bulkInsert('Users', [
       username: "user1", createdAt: Date.now(), updatedAt: Date.now() ,
       username: "user2", createdAt: Date.now(), updatedAt: Date.now() 
    ])
  ];

但我仍然想知道这是否是为我的数据库播种的正确方法。有没有办法使用User.create() 做到这一点?

【问题讨论】:

我在使用 Date.now() 时遇到了问题,需要将其替换为 new Date()。使用 SQLite,无法查询数据库,因为时间以错误的格式保存(Uncaught TypeError: date.indexOf is not a function in sequelize/lib/dialects/sqlite/data-types.js:28:14 【参考方案1】:

你可以使用下一个:

const City = sequelize.define('city', 
  name:  type: Sequelize.STRING ,
  order_:  type: Sequelize.INTEGER 
);
City.sync().then(() => 
  City.create(
    name: 'Neuquen',
    order_: 0
  );
  City.create(
    name: 'General Roca',
    order_: 1
  );
);

或在http://docs.sequelizejs.com/en/latest/docs/migrations/阅读有关“迁移”的信息

【讨论】:

相同的代码对我不起作用。重新运行我的应用程序(以便表已经存在)后,插入语句运行得很好,但是在第一次运行应用程序时(正在创建表)只有一些插入语句是成功的。【参考方案2】:
new Date()

mysql也需要,即

  return queryInterface.bulkInsert('users', [
  
    "Forename":"A",
    "Surname": "User",
    "UserType":"1",
    "Email":"auser@gmail.com",
    "Password":"password",
    "LastLogin":0,
    "Tokens": JSON.stringify("tokens":[]),
    "CreatedBy": 999,
    "CreatedAt": new Date(),
    "UpdatedAt": new Date()
  ]);

【讨论】:

【参考方案3】:

可以使用替代方法:sequelize fixtures,您可以使用声明为 json 文件或其他格式的默认数据初始化表。

【讨论】:

【参考方案4】:

对于 sequelize v6 的快速简便方法(无需种子或迁移):

我修改了我的sequelize.sync() 电话:

import  Sequelize  from 'sequelize';

// This will create an in-memory sqlite db
const sequelize = new Sequelize('sqlite::memory:', 
  logging: sequelizeLogger
);

await sequelize
  .sync( force: true )
  .then(() => 
    // seed db
    Users.create( username: 'user1' )
  );

【讨论】:

永远不要在生产中使用同步。如果可能的话,我实际上会劝阻,因为如果您想稍后使用迁移,您似乎基本上必须重新开始创建模型。这也不是 OP 所要求的。

以上是关于如何使用续集迁移/种子插入初始数据?的主要内容,如果未能解决你的问题,请参考以下文章

在heroku中续集迁移

处理续集迁移和初始化的工作流程?

EF6 - 在没有种子的情况下运行更新数据库命令

在烧瓶迁移或 alembic 迁移中创建种子数据

在烧瓶迁移或 alembic 迁移中创建种子数据

如何删除种子而不会对数据库产生任何影响?