如何使用sequelize postgres数据库和迁移来恢复服务器重启

时间:2014-09-21 16:21:01

标签: javascript node.js sqlite postgresql sequelize.js

在我的快递应用程序中,我使用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一样。

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

请注意,初始启动后不应该使用种子。

1 个答案:

答案 0 :(得分:2)

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

sync()执行CREATE TABLE IF NOT EXISTS,因此理论上可以在生产环境中使用它,因为它永远不会破坏任何现有数据。但是,如果您在模型中更改架构,则只有在执行同步时才会在数据库中反映

因此,在生产环境中,您将需要迁移。这意味着你们都需要改变你的续集模型,并在你每次点击时编写一个迁移。有关能够在续集模型文件更改#120时自动创建迁移的讨论,但尚未对此进行任何工作