使用 postgres 和 umzug 时如何为续集迁移定义默认模式?
How to define default schema for sequelize migrations when using postgres and umzug?
我一直在尝试 运行 使用 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 () => {
}
}
它报告成功并使用了正确的架构:
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',
migrations: [Object],
schema: 'custom' } } ]
然而,我需要的是能够定义所有迁移中的所有查询始终 运行 的默认模式,而不是在我想要 运行 的每个查询中定义我需要的模式。
我尝试搜索、阅读库的文档并到处复制粘贴 schema: 'custom'
,但到目前为止除了上面的例子之外没有任何其他效果。
我正在使用以下代码 运行 迁移:
const sequelizeConn = new Sequelize(ENV_DB_URL, {
schema: 'custom',
logging: false
})
const migrator = new Umzug({
storage: 'sequelize',
storageOptions: {
sequelize: sequelizeConn,
tableName: 'migrations',
schema: 'custom'
},
logging: console.log,
migrations: {
params: [
sequelizeConn.getQueryInterface(),
sequelizeConn
],
path: `${process.cwd()}/src/database/migrations`,
pattern: /\.js$/
}
})
migrator.up()
我的 umzug 是 2.2.0
,sequelize 是 5.3.0
。
migrations
table 已正确创建到 custom
架构,但迁移仍然 运行 在 public
架构中。
当 运行 迁移未在查询本身中指定架构时,我收到以下错误。从错误中我们可以看出模式未定义:
{ SequelizeDatabaseError: relation "oldtablename" does not exist
at Query.formatError (/usr/src/app/node_modules/sequelize/lib/dialects/postgres/query.js:354:16)
at query.catch.err (/usr/src/app/node_modules/sequelize/lib/dialects/postgres/query.js:71:18)
at tryCatcher (/usr/src/app/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/usr/src/app/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/usr/src/app/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromise0 (/usr/src/app/node_modules/bluebird/js/release/promise.js:614:10)
at Promise._settlePromises (/usr/src/app/node_modules/bluebird/js/release/promise.js:690:18)
at _drainQueueStep (/usr/src/app/node_modules/bluebird/js/release/async.js:138:12)
at _drainQueue (/usr/src/app/node_modules/bluebird/js/release/async.js:131:9)
at Async._drainQueues (/usr/src/app/node_modules/bluebird/js/release/async.js:147:5)
at Immediate.Async.drainQueues [as _onImmediate] (/usr/src/app/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:705:18)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
at process.topLevelDomainCallback (domain.js:120:23)
name: 'SequelizeDatabaseError',
parent:
{ error: relation "oldtablename" does not exist
at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:554:11)
at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:379:19)
at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:119:22)
at Socket.emit (events.js:189:13)
at Socket.EventEmitter.emit (domain.js:441:20)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
name: 'error',
length: 118,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'namespace.c',
line: '420',
routine: 'RangeVarGetRelidExtended',
sql:
'ALTER TABLE "oldtablename" RENAME TO "newtablename";' },
original:
{ error: relation "oldtablename" does not exist
at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:554:11)
at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:379:19)
at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:119:22)
at Socket.emit (events.js:189:13)
at Socket.EventEmitter.emit (domain.js:441:20)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
name: 'error',
length: 118,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'namespace.c',
line: '420',
routine: 'RangeVarGetRelidExtended',
sql:
'ALTER TABLE "oldtablename" RENAME TO "newtablename";' },
sql:
'ALTER TABLE "oldtablename" RENAME TO "newtablename";' }
这有点令人困惑,但您需要为连接定义搜索路径和方言选项。
const sequelizeConn = new Sequelize(ENV_DB_URL, {
schema: 'custom',
logging: false,
searchPath: 'custom',
dialectOptions: {
prependSearchPath: true
}
})
我一直在尝试 运行 使用 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 () => {
}
}
它报告成功并使用了正确的架构:
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',
migrations: [Object],
schema: 'custom' } } ]
然而,我需要的是能够定义所有迁移中的所有查询始终 运行 的默认模式,而不是在我想要 运行 的每个查询中定义我需要的模式。
我尝试搜索、阅读库的文档并到处复制粘贴 schema: 'custom'
,但到目前为止除了上面的例子之外没有任何其他效果。
我正在使用以下代码 运行 迁移:
const sequelizeConn = new Sequelize(ENV_DB_URL, {
schema: 'custom',
logging: false
})
const migrator = new Umzug({
storage: 'sequelize',
storageOptions: {
sequelize: sequelizeConn,
tableName: 'migrations',
schema: 'custom'
},
logging: console.log,
migrations: {
params: [
sequelizeConn.getQueryInterface(),
sequelizeConn
],
path: `${process.cwd()}/src/database/migrations`,
pattern: /\.js$/
}
})
migrator.up()
我的 umzug 是 2.2.0
,sequelize 是 5.3.0
。
migrations
table 已正确创建到 custom
架构,但迁移仍然 运行 在 public
架构中。
当 运行 迁移未在查询本身中指定架构时,我收到以下错误。从错误中我们可以看出模式未定义:
{ SequelizeDatabaseError: relation "oldtablename" does not exist
at Query.formatError (/usr/src/app/node_modules/sequelize/lib/dialects/postgres/query.js:354:16)
at query.catch.err (/usr/src/app/node_modules/sequelize/lib/dialects/postgres/query.js:71:18)
at tryCatcher (/usr/src/app/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/usr/src/app/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/usr/src/app/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromise0 (/usr/src/app/node_modules/bluebird/js/release/promise.js:614:10)
at Promise._settlePromises (/usr/src/app/node_modules/bluebird/js/release/promise.js:690:18)
at _drainQueueStep (/usr/src/app/node_modules/bluebird/js/release/async.js:138:12)
at _drainQueue (/usr/src/app/node_modules/bluebird/js/release/async.js:131:9)
at Async._drainQueues (/usr/src/app/node_modules/bluebird/js/release/async.js:147:5)
at Immediate.Async.drainQueues [as _onImmediate] (/usr/src/app/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:705:18)
at tryOnImmediate (timers.js:676:5)
at processImmediate (timers.js:658:5)
at process.topLevelDomainCallback (domain.js:120:23)
name: 'SequelizeDatabaseError',
parent:
{ error: relation "oldtablename" does not exist
at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:554:11)
at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:379:19)
at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:119:22)
at Socket.emit (events.js:189:13)
at Socket.EventEmitter.emit (domain.js:441:20)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
name: 'error',
length: 118,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'namespace.c',
line: '420',
routine: 'RangeVarGetRelidExtended',
sql:
'ALTER TABLE "oldtablename" RENAME TO "newtablename";' },
original:
{ error: relation "oldtablename" does not exist
at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:554:11)
at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:379:19)
at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:119:22)
at Socket.emit (events.js:189:13)
at Socket.EventEmitter.emit (domain.js:441:20)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
name: 'error',
length: 118,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'namespace.c',
line: '420',
routine: 'RangeVarGetRelidExtended',
sql:
'ALTER TABLE "oldtablename" RENAME TO "newtablename";' },
sql:
'ALTER TABLE "oldtablename" RENAME TO "newtablename";' }
这有点令人困惑,但您需要为连接定义搜索路径和方言选项。
const sequelizeConn = new Sequelize(ENV_DB_URL, {
schema: 'custom',
logging: false,
searchPath: 'custom',
dialectOptions: {
prependSearchPath: true
}
})