在我的快递应用程序中,我使用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一样。
那么,即使重新启动服务器,我还需要做些什么才能将数据保存在数据库中,这与数据库迁移有关吗?
请注意,初始启动后不应该使用种子。
答案 0 :(得分:2)
sync({ force: true })
主要用于测试,包括用户测试和内部续集测试。
sync()
执行CREATE TABLE IF NOT EXISTS
,因此理论上可以在生产环境中使用它,因为它永远不会破坏任何现有数据。但是,如果您在模型中更改架构,则只有在执行同步时才会在数据库中反映
因此,在生产环境中,您将需要迁移。这意味着你们都需要改变你的续集模型,并在你每次点击时编写一个迁移。有关能够在续集模型文件更改#120时自动创建迁移的讨论,但尚未对此进行任何工作