使用TypeORM的SQL Server:错误超时:按批插入记录时请求无法完成

问题描述 投票:2回答:1

我遇到的问题是,当我运行迁移命令时,总是会收到ETIMEOUT错误,但是如果我注释掉await populateTable(),代码将运行而没有任何错误。

我已经尝试将requestTimeout从15秒增加到300秒,但这没有帮助。

这是我的代码:

创建以下内容:

// ormconfig.json
[
  {
    "name": "app",
    "type": "mssql",
    "host": "127.0.0.1",
    "port": 1433,
    "username": "root",
    "password": "root",
    "database": "app",
    "logging": true,
    "options": {
      "useUTC": true
    },
    "entities": ["src/**/*.entity.ts"],
    "migrations": ["migration/**/*.ts"],
    "cli": {
      "migrationsDir": "migration"
    }
  }
]

// root-dir/src/grouping/grouping.entity.ts
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm';

@Entity({ name: 'grouping' })
export class Grouping {

  @PrimaryGeneratedColumn({ name: 'id', unsigned: true })
  id: number;

  @Column({ name: 'name', unique: true })
  name: string;
}
// root-dir/migration/tables/grouping.ts
import { getRepository, QueryRunner, Table, TableIndex } from 'typeorm';
import { Grouping } from '../../src/grouping/grouping.entity';

export async function up(queryRunner: QueryRunner): Promise<any> {
  await createTable(queryRunner);
  await createIndexes(queryRunner);
  await populateTable();
}

export async function down(queryRunner: QueryRunner): Promise<any> {
  await queryRunner.dropIndex('grouping', 'IDX_GROUP');
  await queryRunner.dropTable('grouping');
}

async function createTable(queryRunner: QueryRunner) {
  return queryRunner.createTable(
    new Table({
      name: 'grouping',
      columns: [
        {
          name: 'id',
          type: 'integer',
          isPrimary: true,
          isGenerated: true,
          generationStrategy: 'increment',
          unsigned: true,
        },
        {
          name: 'name',
          type: 'varchar',
          isUnique: true,
        },
      ],
    }),
    true,
  );
}

async function createIndexes(queryRunner: QueryRunner) {
  return await queryRunner.createIndex(
    'grouping',
    new TableIndex({
      name: 'IDX_GROUP',
      columnNames: ['name'],
    }),
  );
}

async function populateTable() {
  await getRepository(Grouping, 'app').save([{ name: 'classification' }, { name: 'categorization' }]);
}
// root-dir/migration/initial-migration.ts
import { MigrationInterface, QueryRunner } from 'typeorm';
import * as groupingTable from './tables/grouping';

export class InitialMigration1550229771145 implements MigrationInterface {
  async up(queryRunner: QueryRunner): Promise<any> {
    await groupingTable.up(queryRunner);
  }

  async down(queryRunner: QueryRunner): Promise<any> {
    await groupingTable.down(queryRunner);
  }
}

运行迁移命令。

ts-node ./node_modules/typeorm/cli.js migration:run -c

这应该创建Grouping表并插入2条记录,但是我得到的是此错误:

查询:CREATE TABLE“ grouping”(“ id”整数NOT NULL IDENTITY(1,1),“ name” varchar(255)NOT NULL,CONSTRAINT“ UQ_07314fe287a837177015c041131” UNIQUE(“名称”),CONSTRAINT“ PK_135d73da7246e0250716afKEY0ab” PRIMARY (“ID”)) 查询:SELECT SCHEMA_NAME()AS“ schema_name” 查询:SELECT DB_NAME()AS“ db_name” 查询:SELECT * FROM“ app”。“ INFORMATION_SCHEMA”。“ TABLES”在哪里(“ TABLE_SCHEMA” ='dbo'和“ TABLE_NAME” ='grouping') 查询:SELECT * FROM“ app”。“ INFORMATION_SCHEMA”。“ COLUMNS”在哪里(“ TABLE_SCHEMA” ='dbo'和“ TABLE_NAME” ='grouping') 查询:SELECT“ columnUsages”。*,“ tableConstraints”。“ CONSTRAINT_TYPE”,“ chk”。“定义”来自“ app”。“ INFORMATION_SCHEMA”。“ CONSTRAINT_COLUMN_USAGE”“ columnUsages” INNER JOIN“ app”。“ INFORMATION_SCHEMA”。 TABLE_CONSTRAINTS“” tableConstraints“ ON” tableConstraints“。” CONSTRAINT_NAME“ =” columnUsages“。” CONSTRAINT_NAME“ LEFT JOIN” app“。” sys“。” check_constraints“” chk“在” chk“。” name“ =” columnUsages“。 “ CONSTRAINT_NAME”在哪里(((“ columnUsages”。“ TABLE_SCHEMA” ='dbo'AND“ columnUsages”。“ TABLE_NAME” ='grouping'AND“ tableConstraints”。“ TABLE_SCHEMA” ='dbo'AND“ tableConstraints”。“ TABLE_NAME” = 'grouping'))和“ tableConstraints”。“ CONSTRAINT_TYPE” IN('PRIMARY KEY','UNIQUE','CHECK') 查询:SELECT“ fk”。“名称” AS“ FK_NAME”,'app'AS“ TABLE_CATALOG”,“ s1”。“名称” AS“ TABLE_SCHEMA”,“ t1”。“名称” AS“ TABLE_NAME”,“ col1” “。”名称“ AS” COLUMN_NAME“,” s2“。”名称“ AS” REF_SCHEMA“,” t2“。”名称“ AS” REF_TABLE“,” col2“。”名称“ AS” REF_COLUMN“,” fk“。” delete_referential_action_desc“ AS” ON_DELETE“,” fk“。” update_referential_action_desc“ AS” ON_UPDATE“ FROM” app“。” sys“。” foreign_keys“” fk“ INNER JOIN” app“。” sys“。” foreign_key_columns“” fkc“ ON “ fkc”。“ constraint_object_id” =“ fk”。“ object_id” INNER JOIN“ app”。“ sys”。“表”“ t1” ON“ t1”。“ object_id” =“ fk”。“ parent_object_id” INNER JOIN“ app“。” sys“。” schemas“” s1“ ON” s1“。” schema_id“ =” t1“。” schema_id“ INNER JOIN” app“。” sys“。”表“” t2“ ON” t2“。 “” object_id“ =” fk“。” referenced_object_id“ INNER JOIN” app“。” sys“。” schemas“” s2“ ON” s2“。” schema_id“ =” t2“。” schema_id“ INNER JOIN” app“。” sys“。” columns“” col1“ ON” col1“。” column_id“ =” fkc“。” parent_column_id“ AND” col1“。” object_id“ =” fk“。” parent_object_id“ INNER JOIN” app“。” sys“ 。“ columns”“ col2” ON“ co l2“。”“ column_id” =“ fkc”。“ referenced_column_id” AND“ col2”。“ object_id” =“ fk”。“ referenced_object_id” 查询:从“应用”中选择“ TABLE_CATALOG”,“ TABLE_SCHEMA”,“ COLUMN_NAME”,“ TABLE_NAME”。“ INFORMATION_SCHEMA”。“ COLUMNS” WHERE COLUMNPROPERTY(object_id(“ TABLE_CATALOG” +'。'+“ TABLE_SCHEMA” +'。' +“ TABLE_NAME”),“ COLUMN_NAME”,'IsIdentity')= 1 AND“ TABLE_SCHEMA” IN('dbo') 查询:从“ sys”中选择“ NAME”,“ COLLATION_NAME”。“数据库” 查询:SELECT'app'AS“ TABLE_CATALOG”,“ s”。“名称” AS“ TABLE_SCHEMA”,“ t”。“名称” AS“ TABLE_NAME”,“ ind”。“名称” AS“ INDEX_NAME”,“ col” 。“名称” AS“ COLUMN_NAME”,“ ind”。“ is_unique” AS“ IS_UNIQUE”,“ ind”。“ filter_definition”作为“ CONDITION”从“ app”。“ sys”。“索引”“ ind” INNER JOIN“ app“。” sys“。” index_columns“” ic“ ON” ic“。” object_id“ =” ind“。” object_id“ AND” ic“。” index_id“ =” ind“。” index_id“ INNER JOIN” app“ 。“” sys“。”列“” col“打开” col“。” object_id“ =” ic“。” object_id“和” col“。” column_id“ =” ic“。” column_id“ INNER JOIN” app“。” sys“。” tables“” t“ ON” t“。” object_id“ =” ind“。” object_id“ INNER JOIN” app“。” sys“。” schemas“” s“ ON” s“。” schema_id“ = “ t”。“ schema_id”其中“ ind”。“ is_primary_key” = 0 AND“ ind”。“ is_unique_constraint” = 0 AND“ t”。“ is_ms_shipped” = 0 查询:在“分组”(“名称”)上创建索引“ IDX_GROUP” 查询:开始交易 查询:INSERT INTO“ grouping”(“ name”)OUTPUT INSERTED。“ id”值(@ 0),(@ 1)-参数:[{“ value”:“分类”,“ type”:“ nvarchar”, “ params”:[]},{“ value”:“分类”,“ type”:“ nvarchar”,“ params”:[]}] 查询失败:INSERT INTO“ grouping”(“ name”)OUTPUT INSERTED。“ id”值(@ 0),(@ 1)-参数:[{“ value”:“分类”,“ type”:“ nvarchar” ,“ params”:[]},{“ value”:“分类”,“ type”:“ nvarchar”,“ params”:[]}] 错误:{RequestError:超时:请求未能在15000毫秒内完成 在Request.tds.Request.err上[作为userCallback](C:\ Users \ me \ Workspace \ app \ api \ node_modules \ mssql \ lib \ tedious.js:629:19) 在Request.callback(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ request.js:37:27) 在Connection.message(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:2136:24) 在Connection.dispatchEvent(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:1084:36) 在MessageIO.messageIo.on(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:984:14) 在MessageIO.emit(events.js:189:13) 在MessageIO.EventEmitter.emit(domain.js:441:20) 在Message.message.on(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ message-io.js:32:14) 在Message.emit(events.js:194:15) 在Message.EventEmitter.emit(domain.js:441:20) 代码:“ ETIMEOUT”, 数字:“ ETIMEOUT”, 状态:未定义, originalError: {RequestError:超时:请求未能在15000ms内完成 在RequestError时(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ errors.js:32:12) 在Connection.message(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:2136:33) 在Connection.dispatchEvent(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:1084:36) 在MessageIO.messageIo.on(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:984:14) 在MessageIO.emit(events.js:189:13) 在MessageIO.EventEmitter.emit(domain.js:441:20) 在Message.message.on(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ message-io.js:32:14) 在Message.emit(events.js:194:15) 在Message.EventEmitter.emit(domain.js:441:20) 在endReadableNT(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ node_modules \ ready-stream \ lib_stream_visible.js:1077:12) 消息:“超时:请求未能在15000毫秒内完成”, 代码:“ ETIMEOUT”}, 名称:“ RequestError”, previousErrors:[]} 查询:ROLLBACK 查询:ROLLBACK 迁移运行期间发生错误: {QueryFailedError:错误:超时:请求未能在15000毫秒内完成 在新的QueryFailedError(C:\ Users \ me \ Workspace \ app \ api \ src \ error \ QueryFailedError.ts:9:9) 在C:\ Users \ me \ Workspace \ app \ api \ src \ driver \ sqlserver \ SqlServerQueryRunner.ts:221:37 在_query(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ mssql \ lib \ base.js:1346:25) 在Request.tds.Request.err上[作为userCallback](C:\ Users \ me \ Workspace \ app \ api \ node_modules \ mssql \ lib \ tedious.js:671:15) 在Request.callback(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ request.js:37:27) 在Connection.message(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:2136:24) 在Connection.dispatchEvent(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:1084:36) 在MessageIO.messageIo.on(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:984:14) 在MessageIO.emit(events.js:189:13) 在MessageIO.EventEmitter.emit(domain.js:441:20) 消息:“错误:超时:请求未能在15000毫秒内完成”, 代码:“ ETIMEOUT”, 数字:“ ETIMEOUT”, 状态:未定义, originalError: {RequestError:超时:请求未能在15000ms内完成 在RequestError时(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ errors.js:32:12) 在Connection.message(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:2136:33) 在Connection.dispatchEvent(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:1084:36) 在MessageIO.messageIo.on(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ connection.js:984:14) 在MessageIO.emit(events.js:189:13) 在MessageIO.EventEmitter.emit(domain.js:441:20) 在Message.message.on(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ lib \ message-io.js:32:14) 在Message.emit(events.js:194:15) 在Message.EventEmitter.emit(domain.js:441:20) 在endReadableNT(C:\ Users \ me \ Workspace \ app \ api \ node_modules \ tedious \ node_modules \ ready-stream \ lib_stream_visible.js:1077:12) 消息:“超时:请求未能在15000毫秒内完成”, 代码:“ ETIMEOUT”}, 名称:“ QueryFailedError”, previousErrors:[], 查询: '将插入到“分组”(“名称”)输出中。“ id”值(@ 0),(@ 1)', 参数: [MssqlParameter {值:'分类',类型:'nvarchar',参数:[]}, MssqlParameter {值:'分类',类型:'nvarchar',参数:[]}]} npm ERR!代码ELIFECYCLE npm ERR! errno 1 npm ERR! [email protected]迁移:运行:ts-node ./node_modules/typeorm/cli.js migration:run -c "app_engine" npm ERR!退出状态1 npm ERR! npm ERR!在[email protected] migration:run脚本处失败。 npm ERR! npm可能不是问题。上面可能还有其他日志记录输出。

npm ERR!可以在以下位置找到此运行的完整日志: npm ERR! C:\ Users \ me \ AppData \ Roaming \ npm-cache_logs \ 2019-06-04T18_56_36_972Z-debug.log

非常感谢您的帮助!

更新:

我在浏览先前的问题时发现了此https://github.com/typeorm/typeorm/issues/3100#issuecomment-446309812,现在可以使用。

sql-server typescript database-migration nestjs typeorm
1个回答
0
投票

尝试使用旧版的npm i mssql @ 5.1.1驱动程序--save

© www.soinside.com 2019 - 2024. All rights reserved.