一些 SQL 数据库的 Sequelize 用户sync({ force: true })在早期经常使用,然后切换到迁移。我很困惑,因为迁移和模型似乎具有相似的语法,但也有一些似乎没有被强烈强调的差异。
一些观察(可能是错误的):
options.indexes模型中的对象在迁移中不起作用(但在模型中起作用)unique: 'somename'不适用于迁移字段属性(但适用于模型);但unique: true两者都适用references需要在迁移中设置a (但在模型中,hasMany/belongsTo 会自动生成外键字段和外键引用)id,createdAt并且updatedAt必须在迁移中手动创建,而不是模型最后两个是有道理的,因为它描述了迁移责任(设置 db 架构)与模型 - 但是迁移支持什么/它如何工作对于类似的项目似乎不同,并且该sync选项加剧了我的困惑。
一些问题:
sync选择)做的迁移工作?sync离散迁移切换到迁移时,其他人是否只是将模型文件复制到迁移中?您是否删除了仅适用于模型的部分无关信息?只适用于迁移?这个简单的测试代码:
return queryInterface.createTable('tadam', {id: Sequelize.INTEGER, humus: Sequelize.STRING(255)})
.then(queryInterface.sequelize.query('ALTER TABLE tadam ADD PRIMARY KEY (id)'));
Run Code Online (Sandbox Code Playgroud)
返回以下错误:
Unhandled rejection SequelizeDatabaseError: relation "tadam" does not exist
Run Code Online (Sandbox Code Playgroud)
现在,据我所知,当第二个承诺(关于改变表格)被执行时,该表尚未创建.
这可能不是因为迁移中的所有查询都是一次执行的,因为我有这个测试迁移:
return queryInterface.sequelize.query('ALTER TABLE tadam DROP CONSTRAINT tadam_pkey')
.then(queryInterface.removeIndex('tadam', 'tadam_pkey'));
Run Code Online (Sandbox Code Playgroud)
它工作正常.
那么,任何人都可以解释为什么第一个不起作用以及如何实现它,以便创建表+添加PK可以从单个迁移执行?
我试图始终使用 sequelize 和 umzug 运行迁移到特定的 postgresql 数据库模式。让我们称之为custom模式。默认情况下,所有查询都转到public架构。
有什么方法可以定义默认模式以在 sequelize 或 umzug 中运行所有迁移?
使用以下代码,我可以为迁移中的单个查询定义架构:
// schema defined according to https://sequelize.readthedocs.io/en/latest/docs/migrations/
module.exports = {
up: async (queryInterface, Sequelize) => {
return Sequelize.transaction(async transaction => {
await queryInterface.renameTable({ tableName: 'oldtablename', schema: "custom"}, 'newtablename', { transaction })
})
},
down: async () => {
}
}
Run Code Online (Sandbox Code Playgroud)
它报告它成功并使用正确的模式:
Migration {
path:
'path/to/migrations/migration_test.js',
file: 'migration_test.js',
options:
{ storage: 'sequelize',
storageOptions: [Object],
logging: [Function: bound consoleCall],
upName: 'up',
downName: 'down', …Run Code Online (Sandbox Code Playgroud) 我需要将迁移文件夹的路径传递给 Umzug 配置,但它正在被 webpack 压缩,这可以吗?
我尝试单独捆绑每个迁移文件,但 Umzug 说它找不到 method up()。
let umzug = new Umzug({
storage: 'sequelize',
storageOptions: {
sequelize: sequelize
},
migrations: {
params: [
sequelize.getQueryInterface(),
Sequelize
],
path: './../db/migrations/*')
}
})
Run Code Online (Sandbox Code Playgroud)
当我尝试手动运行从 webpack 编译的它们时,它说 no method up()。
我正在使用sequelize js和开发一个node js application,将其部署到生产环境并具有实时数据库。
而在发展模式下,如果我需要alter的DB,我以前用做它Sequelize.sync({ force: true })和它的工作好。
但是现在,开发完成后,我想更改表并向其中添加列。
我搜索了许多帖子,但没有获得有关如何运行这些迁移的确切示例。
我尝试使用Umzug并运行迁移,但是这使我出错。
这是我尝试的代码,
migrations / barmigration.js:
var Sequelize = require('sequelize');
"use strict";
module.exports = {
up: function(migration, DataTypes) {
return [
migration.addColumn(
'Bars',
'PrinterId',
Sequelize.STRING
),
migration.addColumn(
'Bars',
'PrinterStatus',
Sequelize.STRING
)]
},
down: function(migration, DataTypes) {
return
[
migration.removeColumn('Bars', 'PrinterStatus'),
migration.removeColumn('Bars', 'PrinterId')
]
}
};
Run Code Online (Sandbox Code Playgroud)
这是umzug configuration:
var Umzug = require('umzug');
var sequelize = require('sequelize');
var …Run Code Online (Sandbox Code Playgroud)