You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 19:03:32