【问题标题】:How to version seeds in Knex?如何在 Knex 中对种子进行版本控制?
【发布时间】:2019-04-12 21:04:38
【问题描述】:

我有一个 sql 文件,我在其中编写用于在发行版中运行的语句,该文件包含如下语句:

-- =======================2019-02-01=======================
UPDATE rating set stars = 3 where id = 6;
UPDATE users SET status = 'A' where last_login >= '2019-01-01';
INSERT INTO....
-- =======================2019-02-15=======================
UPDATE rating set stars = 3 where id = 6;
UPDATE users SET status = 'A' where last_login >= '2019-01-01';
INSERT INTO....

我在每个发布日期都使用具体的句子,但我认为这是不好的做法,它没有可扩展的方法。

我正在尝试将此方法更改为 Knex 种子或迁移。最好的做法是什么?

种子有问题,因为 knex 每次我写命令knex seed:run 时都会执行种子,并显示一些错误。

【问题讨论】:

  • 仅当您想将同一数据集多次插入数据库时​​才应使用种子。迁移适用于在创建模式等过程中添加一次初始数据时。
  • 我已经使用 knex 迁移,类似于我在下面描述的生产方式,你不应该将迁移作为部署的应用程序代码的一部分运行,但如果你需要最小化管理,你可以这样做。始终在本地进行测试。

标签: database-migration knex.js


【解决方案1】:

Knex 存储它已执行的文件名和签名,因此它不需要再次运行它们。

https://knexjs.org/#Installation-migrations

您可以像这样以编程方式执行迁移:

knex({..config..}).migrate.latest({
  directory: 'migrations', // where the files are stored
  tableName: 'knex_migrations' // where knex saves its records
});

示例迁移文件

exports.up = function(knex) {
  return knex.raw(`
   UPDATE rating set stars = 3 where id = 6;
   UPDATE users SET status = 'A' where last_login >= '2019-01-01';
   INSERT INTO....
  `)
};

文件将按字母顺序/排序执行,不会针对同一数据库重新执行。

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 2011-10-13
    • 1970-01-01
    • 2018-06-16
    • 2014-10-29
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    相关资源
    最近更新 更多