TypeORM迁移报错:string类型参数无法赋值给any[]类型
报错原因
queryRunner.query 方法的入参规则不支持传入多个独立SQL字符串作为并列参数。该方法第二个参数的类型定义是any[],作用是传递SQL语句的预编译参数,你把第二条ALTER语句放在第二个参数的位置,TypeScript检测到传入的是string类型,和要求的数组类型不匹配,就抛出了对应的类型错误。
单条语句执行不报错,是因为你只传了第一个SQL字符串参数,没有传第二个参数,符合类型要求。
问题结论
- 不存在“单次只能修改单表”的限制
- 同一个迁移文件完全支持同时修改多张表
正确写法
写法1:逐条调用query方法(推荐)
每个SQL语句单独调用一次queryRunner.query执行,兼容性最好,不需要额外修改数据库驱动配置,出错时也能快速定位是哪条语句失败:
import { MigrationInterface, QueryRunner } from "typeorm" export class changeAddressNumberDatatype1654614315001 implements MigrationInterface { async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(`ALTER TABLE "accounts" MODIFY "address_number" varchar(50)`); await queryRunner.query(`ALTER TABLE "service-request" MODIFY "address_number" varchar(50)`); } async down(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(`ALTER TABLE "accounts" MODIFY "address_number" int`); await queryRunner.query(`ALTER TABLE "service-request" MODIFY "address_number" int`); } }
写法2:合并SQL单次执行
如果你的数据库驱动开启了多语句执行支持,可以把多条SQL用分号拼接成一个字符串,单次调用执行:
async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(` ALTER TABLE "accounts" MODIFY "address_number" varchar(50); ALTER TABLE "service-request" MODIFY "address_number" varchar(50); `); } async down(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(` ALTER TABLE "accounts" MODIFY "address_number" int; ALTER TABLE "service-request" MODIFY "address_number" int; `); }
注意:多数数据库驱动默认关闭多语句执行能力,避免SQL注入风险,非特殊场景不推荐用这种写法。
内容的提问来源于stack exchange,提问作者user5482212
相关产品推荐
相关产品推荐

