在我的 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'
});
}
如您所见,我使用 SQlite 和平面文件
作为开发存储,使用 Postgres 进行生产。
问题是每次我重新启动服务器时,数据库中的数据都会消失。 SQlite 是这样,我想 Postgres 也是这样。
那么即使我重新启动服务器,我必须做什么才能将数据保留在数据库中,这与数据库迁移有关吗?
请注意,初始启动后不需要种子。
最佳答案
sync({force: true })
主要用于测试,包括用户测试和 Sequelize 内部测试。
sync()
会CREATE TABLE IF NOT EXISTS
,因此理论上它可以在生产环境中使用,因为它永远不会破坏任何现有数据。但是,如果您更改模型中的架构,并且仅进行同步,则不会反射(reflect)在数据库中
因此,在生产环境中您将需要迁移。这意味着您都需要更改您的 Sequelize 模型,并在每次更改某些内容时编写迁移。有人讨论当 Sequelize 模型文件更改时能够自动创建迁移#120但尚未对此进行任何工作
关于javascript - 如何通过sequelize postgres数据库和迁移在服务器重启后幸存下来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25961260/