【问题标题】: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

标签: node.js express migration sequelize.js


【解决方案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 所要求的。
      猜你喜欢
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 2012-11-10
      • 2018-01-29
      • 2020-01-20
      • 1970-01-01
      相关资源
      最近更新 更多