如何通过sequelize-postgres数据库和迁移在服务器重启后幸存下来

How to survive server restart with sequelize postgres database and migrations

本文关键字:重启 服务器 sequelize-postgres 何通过 数据库 迁移      更新时间:2023-09-26

在我的express应用程序中,我使用Sequelize来管理数据库。这是我的引导程序代码。

db.sequelize
  .sync({ force: true})
  .complete(function(err) {
    if (err) {
      throw err[0];
    } else {
       //seed
       require('../db/seed')(db);
        app.listen(app.get('port'), function() {
          console.log('express listening on ' + app.get('port'));
        });
    }
});

正如你所看到的,每次我首先启动服务器时,我都会用硬编码的数据为数据库播种。

以下是初始化sequelize的代码:

if (process.env.NODE_ENV === 'test') {
  console.log('[test] using in memory database');
  sequelize = new Sequelize('marbles-site-db', null, null, {
    dialect: 'sqlite',
    storage: ':memory:'
  });
} else if (process.env.HEROKU_POSTGRESQL_WHITE_URL) {
  var match = process.env.HEROKU_POSTGRESQL_WHITE_URL
                .match(/postgres:'/'/([^:]+):([^@]+)@([^:]+):('d+)'/(.+)/);
  sequelize = new Sequelize(match[5], match[1], match[2], {
    dialect: 'postgres',
    protocol: 'postgres',
    port: match[4],
    host: match[3],
    logging: true // false
  });
} else {
  sequelize = new Sequelize('marbles-site-db', null, null, {
    dialect: 'sqlite',
    storage: './db/development.sqlite'
  });
}

正如您所看到的,我使用带有flat file的SQlite作为开发的存储,使用Postgres作为生产的存储。

问题是每次我重新启动服务器时,数据库中的数据都不见了。SQlite就是这样,我想Postgres也是如此。

那么,即使重新启动服务器,我也必须做些什么才能将数据保留在数据库中?这与数据库迁移有关吗?

请注意,初始引导之后不应该需要种子。

sync({ force: true })主要用于测试,包括用户测试和内部测试。

sync()CREATE TABLE IF NOT EXISTS,因此理论上可以在生产环境中使用,因为它永远不会破坏任何现有数据。然而,如果您在模型中更改了模式,那么如果您只同步,那么这将不会反映在DB中

因此,在生产环境中,您将需要迁移。这意味着你们两个都需要更改序列化模型,并在每次更改某个内容时编写一个迁移。有人说,当序列化模型文件更改#120时,可以自动创建迁移,但目前还没有对此进行任何工作

请注意sequelize.sync方法在代码开始时重置所有数据。也许您可以在不使用sync()方法的情况下生成另一个解决方案