TypeORM и SQL Server — Установите «НЕКЛАСТЕРИЗОВАННЫЙ» и «НЕ ПРИНУДИТЕЛЬНЫЙ» для первичного ключа

#sql-server #typeorm

Вопрос:

Вопрос: как я могу настроить основной столбец сущности TypeORM с NONCLUSTERED помощью и NOT ENFORCED в SQL Server?

контекст

Я пытаюсь настроить подключение к экземпляру SQL Server в Azure для использования с их службой Synapse. В этом случае соединение предъявляет очень специфические требования к первичному ключу (подробнее здесь), в основном мне нужно установить NONCLUSTERED и NOT ENFORCED на мой первичный ключ, или у меня нет первичного ключа.

Поскольку TypeORM не принимает сущность без первичного ключа, я хотел бы настроить первичный ключ в соответствии с требованиями SQL-сервера Synapse.

При настройке моей сущности, такой как:

 @Entity()
export class BlenderEvent {
  @PrimaryGeneratedColumn()
  public id: number;
}
 

Я получаю:

 [Nest] 1165402   - 2021-10-01, 3:35:15 p.m.   [TypeOrmModule] Unable to connect to the database. Retrying (1)...  3524ms
QueryFailedError: Error: Enforced unique constraints are not supported. To create an unenforced unique constraint you must include the NOT ENFORCED syntax as part of your statement.
    at QueryFailedError.TypeORMError [as constructor] (/home/gcardinal/dev/casino/mssql-nestjs-poc/node_modules/typeorm/error/TypeORMError.js:9:28)
    at new QueryFailedError (/home/gcardinal/dev/casino/mssql-nestjs-poc/node_modules/typeorm/error/QueryFailedError.js:13:28)
    at /home/gcardinal/dev/casino/mssql-nestjs-poc/node_modules/typeorm/driver/sqlserver/SqlServerQueryRunner.js:281:46
    at /home/gcardinal/dev/casino/mssql-nestjs-poc/node_modules/mssql/lib/base/request.js:438:25
    at Request.userCallback (/home/gcardinal/dev/casino/mssql-nestjs-poc/node_modules/mssql/lib/tedious/request.js:493:15)
    at Request.callback (/home/gcardinal/dev/casino/mssql-nestjs-poc/node_modules/tedious/lib/request.js:205:14)
    at Parser.onEndOfMessage (/home/gcardinal/dev/casino/mssql-nestjs-poc/node_modules/tedious/lib/connection.js:3078:22)
    at Object.onceWrapper (node:events:509:28)
    at Parser.emit (node:events:390:28)
    at Readable.<anonymous> (/home/gcardinal/dev/casino/mssql-nestjs-poc/node_modules/tedious/lib/token/token-stream-parser.js:34:12)
 

То же самое, если я использую @PrimaryColumn() вместо @PrimaryGeneratedColumn() .

Как я мог этого добиться?

Комментарии:

1. Просто запретите TypeORM создавать или изменять ваши таблицы и создавайте их непосредственно в Synapse. Похоже, что он управляется настройкой под названием «синхронизация схемы». github.com/typeorm/typeorm/issues/3939

2. Похоже, это должно быть решением. Имеет смысл, что мое приложение не должно создавать таблицы, если они не существуют, особенно на производстве.

Ответ №1:

Вы не. Лучший способ действий в этой ситуации-запретить TypeORM создавать или изменять таблицы в вашей базе данных с synchronize: false помощью параметров TypeORM. Это остановит его от жалоб на отсутствие первичного ключа.

Если вы хотите иметь инфраструктуру в качестве кода для своей базы данных (как в моем случае), ваш микросервис не подходит для этого.

Спасибо @David Browne за предложение в комментарии к моему вопросу.