【问题标题】:find records in sequelize seeds在 sequelize seed 中查找记录
【发布时间】:2021-06-28 17:23:45
【问题描述】:

我一直在尝试为我的项目编写一些种子,但遇到了一些障碍。

我的users 和roles 表有many-to-many 关系。因此,当我为数据库播种时,我需要在我的联接表中添加一条具有正确 ID 的记录。为此,我需要通过email 找到用户并通过name 找到角色并获得ids,这就是问题所在。我在sequelize site 上找不到任何好的文档。我正在使用sequelize-cli 进行播种和迁移。我将queryInterface 作为参数,但我找不到任何示例或提及这件事实际上可以做什么。只是一些简单的例子让我完成了迁移(不知何故)以及我在谷歌上能找到的东西。

我已经通过使用我会说的“肮脏技巧”解决了这个问题......

// user_seeds.js
up: function (queryInterface, Sequelize) {
  return queryInterface.bulkInsert(table, [{
    id: 1,
    name: 'John doe',
    email: 'john@doe.com',
    created_at,
    updated_at
}], {});

// roles_seeds.js
up: function (queryInterface, Sequelize) {
  return queryInterface.bulkInsert(table, [{
    id: 1,
    name: 'admin',
    created_at,
    updated_at
  }, {
    id: 2,
    name: 'user',
    created_at,
    updated_at
}]);

//user_roles_seeds.js
up: function (queryInterface, Sequelize) {
    return queryInterface.bulkInsert(table, [{
    employee_id: 1,
    role_id: 1
  }]);
},

不喜欢这个解决方案,因为如果我想再次运行种子并忘记它是如何工作的,将来可能会很麻烦。我应该有一种方法可以使用这个queryInterface 查询数据库。我想知道你们中是否有人遇到过这个问题并解决了,如果有,请分享。

【问题讨论】:

标签: node.js sequelize.js sequelize-cli


【解决方案1】:

是的,您可以使用 queryInterface 来查询数据库。

  async up(queryInterface, Sequelize) {
    const user = await queryInterface.rawSelect('User', {
      where: {
        name: 'John doe',
      },
    }, ['id']);

    if(!user) {
       // do bulkInsert stuff.
    }
  },

【讨论】:

  • 这对我来说非常完美,感谢 BenHu。请注意,如果每个表都有不同的种子文件,那么种子的顺序很重要(Sequelize CLI 按字母顺序加载它们) - 如果需要,只需重命名它们即可重新排序。
  • 我看到这是一个好方法,但我不知道为什么它只返回一条记录。我想把所有东西都放在where 条件下。你能帮帮我吗?
【解决方案2】:

我无法添加评论,尽管这是对已接受答案 here 的修改。

将plain: false 添加到查询选项以返回所有匹配条目。 Sequelize 似乎没有rawSelect 的文档。但是看看 repo,它基本上是从提供的参数构造一个原始查询。欲了解更多信息https://sequelize.org/master/manual/raw-queries.html

所以它应该是这样的:

const users = await queryInterface.rawSelect(
      'Users',
        {
          where: {
            age: null,
          },
          plain: false,
        },
        ['id'],
      );

【讨论】:

  • 谢谢你。我也没有找到 rawSelect 的文档,我想知道为什么我只得到一个类似查询的结果。纯假成功了。
【解决方案3】:

这可能不是解决此问题的最佳做法,但我找不到更好的方法,这足以让我满意。

基本上我所做的是需要所需表的实际模型并使用普通的 Sequelize API 来查找记录。

所以基本上,打一拳

const { User } = require('./models');

up: function (queryInterface, Sequelize) {
  return User.findOrCreate({
    where: { email: 'john@doe.com' },
    defaults: {
      name: 'John Doe'
    }
  });

等等等等。 希望这对某人有帮助,如果有人有更好的方法,请分享。

【讨论】:

  • 这是一个很好的方法,但是当我们使用 ES6 babel 时,在 sequelize 配置、模型等中使用 import 时会出现问题。
猜你喜欢
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2016-03-01
  • 1970-01-01
相关资源
最近更新 更多