#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 за предложение в комментарии к моему вопросу.