Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Error during migration run: QueryFailedError: VT10001: foreign key constraints are not allowed

Estou utilizando o curso "Nest.js: lidando com migrações, relacionamentos ORM e erros em uma API" como base para montar minha aplicação, não estou fazendo a mesma aplicação do curso mas estou usando os conceitos.

Estou utilizando o banco de dados do planetscale que é mysql.

E está ocorrendo este error comigo quando eu roda as migrations:

query failed: ALTER TABLE `subscriptions` ADD CONSTRAINT `FK_fbdba4e2ac694cf8c9cecf4dc84` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
error: Error: VT10001: foreign key constraints are not allowed
query: ROLLBACK
Error during migration run:
QueryFailedError: VT10001: foreign key constraints are not allowed
    at Query.onResult (C:\Users\DELL\Desktop\rss_backend\node_modules\typeorm\src\driver\mysql\MysqlQueryRunner.ts:222:33)
    at Query.execute (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\commands\command.js:36:14)
    at PoolConnection.handlePacket (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\connection.js:478:34)
    at PacketParser.onPacket (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\connection.js:97:12)
    at PacketParser.executeStart (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\packet_parser.js:75:16)
    at TLSSocket.<anonymous> (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\connection.js:392:25)
    at TLSSocket.emit (node:events:513:28)
    at TLSSocket.emit (node:domain:489:12)
    at addChunk (node:internal/streams/readable:324:12)
    at readableAddChunk (node:internal/streams/readable:297:9) {
  query: 'ALTER TABLE `subscriptions` ADD CONSTRAINT `FK_fbdba4e2ac694cf8c9cecf4dc84` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION',
  parameters: undefined,
  driverError: Error: VT10001: foreign key constraints are not allowed
      at Packet.asError (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\packets\packet.js:728:17)
      at Query.execute (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\commands\command.js:29:26)
      at PoolConnection.handlePacket (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\connection.js:478:34)
      at PacketParser.onPacket (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\connection.js:97:12)
      at PacketParser.executeStart (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\packet_parser.js:75:16)
      at TLSSocket.<anonymous> (C:\Users\DELL\Desktop\rss_backend\node_modules\mysql2\lib\connection.js:392:25)
      at TLSSocket.emit (node:events:513:28)
      at TLSSocket.emit (node:domain:489:12)
      at addChunk (node:internal/streams/readable:324:12)
      at readableAddChunk (node:internal/streams/readable:297:9) {
    code: 'ER_UNKNOWN_ERROR',
    errno: 1105,
    sqlState: 'HY000',
    sqlMessage: 'VT10001: foreign key constraints are not allowed',
    sql: 'ALTER TABLE `subscriptions` ADD CONSTRAINT `FK_fbdba4e2ac694cf8c9cecf4dc84` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE NO ACEY (`userId`) REFERENCES `users`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION'
  },
  code: 'ER_UNKNOWN_ERROR',
  errno: 1105,
  sqlState: 'HY000',
  sqlMessage: 'VT10001: foreign key constraints are not allowed',
  sql: 'ALTER TABLE `subscriptions` ADD CONSTRAINT `FK_fbdba4e2ac694cf8c9cecf4dc84` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE NO ACTI (`userId`) REFERENCES `users`(`id`) ON DELETE NO ACTION ON UPDATE NO ACTION'
}

Se puderem ajudar.

2 respostas

Achei a resposta, bastou eu colocar no relacionamento do typeorm a opção createForeignKeyConstraints: false, assim ele não tenta gerar a foreign key; O planetscale não aceita chave estrageira.

Exemplo:

@ManyToOne(() => CategoryEntity,(categoryEntity) => categoryEntity.product, {createForeignKeyConstraints: false, eager: true})
    category: CategoryEntity
solução!

Olá, Nilton

O erro que você está encontrando é específico do Planetscale, um banco de dados relacional compatível com MySQL. O Planetscale, por enquanto, não suporta restrições de chave estrangeira. Isso significa que você não pode usar a sintaxe FOREIGN KEY em suas migrações.

Uma alternativa é remover a restrição de chave estrangeira da migração e lidar com a integridade referencial em seu código de aplicação. Isso significa que você precisará garantir que os dados que você está inserindo na tabela subscriptions tenham um userId válido na tabela users.

Por exemplo, antes de inserir um novo registro na tabela subscriptions, você pode fazer uma consulta à tabela users para verificar se o userId existe. Se não existir, você pode retornar um erro para o usuário.

Aqui está um exemplo de como você pode fazer isso em seu código:

// Antes de inserir um novo registro na tabela 'subscriptions'
const user = await userRepository.findOne(userId);
if (!user) {
  throw new Error('User does not exist');
}
// Se o usuário existir, você pode continuar com a inserção

Lembre-se, essa é apenas uma sugestão e pode não ser a solução perfeita para o seu caso específico.

Espero ter ajudado e bons estudos!