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

使用TypeORM迁移CockroachDB时只读事务错误求助

TypeORM + CockroachDB迁移报错:无法在只读事务中执行CREATE SEQUENCE

使用TypeORM对CockroachDB执行数据库迁移时,遇到了**「无法在只读事务中执行CREATE SEQUENCE」**的错误。尝试过修改DataSource配置、在迁移代码中显式设置事务只读相关变量为off等方法,但均未解决问题。以下是相关配置文件、自动生成的迁移文件及完整错误日志,恳请提供解决指导:

dataSource.ts 配置文件

import { DataSource } from 'typeorm';
import { Step } from './src/recipe/entity/step.entity';
import { Chemical } from './src/recipe/entity/chemical.entity';
import { Recipe } from './src/recipe/entity/recipe.entity';

export const dataSource = new DataSource({
    type: "cockroachdb",
    timeTravelQueries: true,
    url: "xxxx-xxxxxxx-xxxxx",
    ssl: true,
    synchronize: false,
    logging: true,
    entities: [Step,Chemical,Recipe],
    migrations: [__dirname + '/src/**/migrations/*{.ts,.js}'],
    extra: {
      enableExperiments: ['sequence-ddl'],
  
}});


async () => {await dataSource.initialize()
  .then(() => {
    console.log('Data Source has been initialized!');
    // async (): Promise<void> =>{
    //   await dataSource.query(`SET default_transaction_use_follower_reads = 'off';`);
    //   // Your migration code here
    // }

    console.log('Follower reads setting has been disabled.');
    
    })
  .catch((err) => {
    console.error('Error during Data Source initialization', err);
  });}

自动生成的迁移文件

import { MigrationInterface, QueryRunner, Transaction } from "typeorm";
import { writeHeapSnapshot } from "v8";

export class Migration011720100667518 implements MigrationInterface {
    name = 'Migration011720100667518'
    public async set_trans_off(queryRunner: QueryRunner): Promise<void>{
        
    }
    
    public async up(queryRunner: QueryRunner): Promise<void> {
        // // await queryRunner.query().
        // await queryRunner.startTransaction('READ WRITE');
        await queryRunner.query(`SET default_transaction_read_only "off"`);
        await queryRunner.query(`SET default_transaction_use_follower_reads = 'off';`);
        await queryRunner.query(`ALTER TABLE "step" DROP CONSTRAINT "FK_e43ba0c1168808a120724d0bd85"`);
        await queryRunner.query(`DROP INDEX "step"@"IDX_e43ba0c1168808a120724d0bd8" CASCADE`);
        await queryRunner.query(`ALTER TABLE "step" RENAME COLUMN "chemicalId" TO "created_at"`);
        await queryRunner.query(`CREATE TABLE "step_chemicals_chemical" ("stepId" int8 NOT NULL, "chemicalId" int8 NOT NULL, CONSTRAINT "PK_2509c715e13ddba6b71791087a8" PRIMARY KEY ("stepId", "chemicalId"))`);
        await queryRunner.query(`CREATE INDEX "IDX_fc0f013cbac13b0a0241573785" ON "step_chemicals_chemical" ("stepId") `);
        await queryRunner.query(`CREATE INDEX "IDX_604ee43998e40a8af82e001fcd" ON "step_chemicals_chemical" ("chemicalId") `);
        await queryRunner.query(`ALTER TABLE "recipe" ADD "isdeleted" bool NOT NULL`);
        await queryRunner.query(`ALTER TABLE "recipe" ADD "created_at" timestamptz NOT NULL DEFAULT current_timestamp()`);
        await queryRunner.query(`ALTER TABLE "chemical" ADD "created_at" timestamptz NOT NULL DEFAULT current_timestamp()`);
        await queryRunner.query(`ALTER TABLE "step" DROP COLUMN "created_at"`);
        await queryRunner.query(`ALTER TABLE "step" ADD "created_at" timestamptz NOT NULL DEFAULT current_timestamp()`);
        await queryRunner.query(`ALTER TABLE "step_chemicals_chemical" ADD CONSTRAINT "FK_fc0f013cbac13b0a0241573785a" FOREIGN KEY ("stepId") REFERENCES "step"("id") ON DELETE CASCADE ON UPDATE CASCADE`);
        await queryRunner.query(`ALTER TABLE "step_chemicals_chemical" ADD CONSTRAINT "FK_604ee43998e40a8af82e001fcd4" FOREIGN KEY ("chemicalId") REFERENCES "chemical"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`ALTER TABLE "step_chemicals_chemical" DROP CONSTRAINT "FK_604ee43998e40a8af82e001fcd4"`);
        await queryRunner.query(`ALTER TABLE "step_chemicals_chemical" DROP CONSTRAINT "FK_fc0f013cbac13b0a0241573785a"`);
        await queryRunner.query(`ALTER TABLE "step" DROP COLUMN "created_at"`);
        await queryRunner.query(`ALTER TABLE "step" ADD "created_at" int8`);
        await queryRunner.query(`ALTER TABLE "chemical" DROP COLUMN "created_at"`);
        await queryRunner.query(`ALTER TABLE "recipe" DROP COLUMN "created_at"`);
        await queryRunner.query(`ALTER TABLE "recipe" DROP COLUMN "isdeleted"`);
        await queryRunner.query(`DROP INDEX "step_chemicals_chemical"@"IDX_604ee43998e40a8af82e001fcd" CASCADE`);
        await queryRunner.query(`DROP INDEX "step_chemicals_chemical"@"IDX_fc0f013cbac13b0a0241573785" CASCADE`);
        await queryRunner.query(`DROP TABLE "step_chemicals_chemical"`);
        await queryRunner.query(`ALTER TABLE "step" RENAME COLUMN "created_at" TO "chemicalId"`);
        await queryRunner.query(`CREATE INDEX "IDX_e43ba0c1168808a120724d0bd8" ON "step" ("chemicalId") `);
        await queryRunner.query(`ALTER TABLE "step" ADD CONSTRAINT "FK_e43ba0c1168808a120724d0bd85" FOREIGN KEY ("chemicalId") REFERENCES "chemical"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
    }

}

错误日志

query: SELECT * FROM current_schema()
query: SET default_transaction_use_follower_reads = 'on';
query: SET enable_experimental_alter_column_type_general = true
query: SELECT * FROM "information_schema"."tables" WHERE "table_schema" = 'public' AND "table_name" = 'migrations'
query: CREATE SEQUENCE "migrations_id_seq"
query failed: CREATE SEQUENCE "migrations_id_seq"
error: 错误:无法在只读事务中执行CREATE SEQUENCE
迁移执行期间出错:
QueryFailedError: 无法在只读事务中执行CREATE SEQUENCE
    在 CockroachQueryRunner.query (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\typeorm\src\driver\cockroachdb\CockroachQueryRunner.ts:396:23)
    在 processTicksAndRejections (node:internal/process/task_queues:95:5)
    在异步 CockroachQueryRunner.executeQueries (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\src\query-runner\BaseQueryRunner.ts:660:13)
    在异步 CockroachQueryRunner.createTable (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\typeorm\src\driver\cockroachdb\CockroachQueryRunner.ts:694:9)
    在异步 MigrationExecutor.createMigrationsTableIfNotExist (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\src\migration\MigrationExecutor.ts:505:13)
    在异步 MigrationExecutor.executePendingMigrations (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\src\migration\MigrationExecutor.ts:195:9)
    在异步 DataSource.runMigrations (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\src\data-source\DataSource.ts:403:13)
    在异步 Object.handler (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\src\commands\MigrationRunCommand.ts:76:13) {
  query: 'CREATE SEQUENCE "migrations_id_seq"',
  parameters: undefined,
  driverError: 错误:无法在只读事务中执行CREATE SEQUENCE
      在 Parser.parseErrorMessage (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\pg-protocol\src\parser.ts:369:69)
      在 Parser.handlePacket (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\pg-protocol\src\parser.ts:188:21)
      在 Parser.parse (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\pg-protocol\src\parser.ts:103:30)
      在 TLSSocket.<匿名> (C:\Users\SAAD\Desktop\AKT_FE\akhtarbackend\akhtar_backend\node_modules\pg-protocol\src\index.ts:7:48)
      在 TLSSocket.emit (node:events:519:28)
      在 TLSSocket.emit (node:domain:488:12)
      在 addChunk (node:internal/streams/readable:559:12)
      在 readableAddChunkPushByteMode (node:internal/streams/readable:510:3)
      在 TLSSocket.Readable.push (node:internal/streams/readable:390:5)
      在 TLSWrap.onStreamRead (node:internal/stream_base_commons:191:23) {
    length: 122,
    severity: 'ERROR',
    code: '25006',
    detail: undefined,
    hint: undefined,
    position: undefined,
    internalPosition: undefined,
    internalQuery: undefined,
    where: undefined,
    schema: undefined,
    table: undefined,
    column: undefined,
    dataType: undefined,
    constraint: undefined,
    file: 'relational.go',
    line: '181',
    routine: 'buildRelational'
  },
  length: 122,
  severity: 'ERROR',
  code: '25006',
  detail: undefined,
  hint: undefined,
  position: undefined,
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'relational.go',
  line: '181',
  routine: 'buildRelational'
}

内容的提问来源于stack exchange,提问作者pekka 123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:24:51