使用 knex.js 进行数据迁移在执行批处理插入时会给出违反检查约束错误



在我的快速应用程序中有两个表:

  • 文件
  • document_revision_fields

我需要将document_revision_fields内某些记录的某些列(基于其中一列的值(迁移到新的表document_fields

创建新表的方式如下:

await knex.schema
.createTable('document_fields', (table) => {
table.increments()
table
.text('sid')
.unique()
table.text('applicationId')
table
.foreign('applicationId')
.references('id')
.inTable('applications')
.onDelete('CASCADE')
table.text('documentId')
table
.foreign('documentId')
.references('id')
.inTable('documents')
.onDelete('CASCADE')
table.text('digitalAssetId')
table
.foreign(['digitalAssetId', 'applicationId'])
.references(['id', 'applicationId'])
.inTable('digital_assets')
.onDelete('CASCADE')
table.enu('type', ['text', 'embed', 'slideshow'])
table.text('value')
table.text('copy')
table.text('header')
table.enu('status', ['active', 'inactive', 'deleted'])
table.integer('order')
table.text('meta')
table.timestamp('createdAt').defaultTo(knex.fn.now())
table.timestamp('updatedAt').defaultTo(knex.fn.now())
})

这就是我选择要迁移的行的方式

const rows = await knex('document_revision_fields')
.select(
'document_revision_fields.sid',
'document_revision_fields.applicationId',
'document_revision_fields.documentId',
'document_revision_fields.digitalAssetId',
'document_revision_fields.type',
'document_revision_fields.value',
'document_revision_fields.copy',
'document_revision_fields.header',
'document_revision_fields.status',
'document_revision_fields.order',
'document_revision_fields.meta'
)
.join('documents', 'documents.activeRevisionId', 'document_revision_fields.revisionId')

最后,这就是我尝试将这些行迁移到新表的方式

return knex.batchInsert('document_fields', rows)

直到批处理插入为止的所有内容都可以正常工作。事实上,我可以控制台.log变量,我得到了预期的结果。

但是,当我尝试在新表中批量插入这些行时,出现此错误

Failed to migrate schema.
error: new row for relation "document_fields" violates check constraint "document_fields_type_check"
detail: "Failing row contains (52808, Nmw-5qMsV, 06217620-aee9-11e9-9f1a-4bff6f1a2985, f046adc0-3214-11ea-8056-31c443663220, null, paragraph, <p>Here's President Donald Trump's tweet for reference.&nbsp;</p..., null, null, active, 5, {}, 2020-05-21 07:20:24.022705+02, 2020-05-21 07:20:24.022705+02)."

你能发现任何问题吗?

据我所知,您已经将type设置为枚举:

table.enu('type', ['text', 'embed', 'slideshow'])

但是,您正在尝试插入nullparagraph,并且它们都不是枚举的一部分。

最新更新