#nestjs #typeorm #node.js-typeorm
Вопрос:
У меня есть сценарий, в котором мне нужно сначала сохранить запись и создать еще несколько таблиц, когда запись будет успешно сохранена. Но я не хочу, чтобы все это происходило изолированно. Я имею в виду, что если при создании таблиц возникают некоторые проблемы, я хочу, чтобы сохраненная запись была откатана, и аналогично, если при сохранении записи возникают некоторые проблемы, я не хочу продолжать создание таблиц. Для этого я использовал транзакции TypeORM.
Это то, что я пробовал до сих пор:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { getManager, Repository } from 'typeorm';
import { CreateTenantDto } from './dto/create-tenant.dto';
import { UpdateTenantDto } from './dto/update-tenant.dto';
import { Tenant } from './entities/tenant.entity';
@Injectable()
export class TenantService {
constructor(
@InjectRepository(Tenant)
private tenantRepo: Repository<Tenant>
) { }
async create(createTenantDto: CreateTenantDto) {
try {
const { tenant_id, tenant_name } = createTenantDto
const tenant = new Tenant()
tenant.tenant_id = tenant_id
tenant.tenant_name = tenant_name
const createdTenant = await this.createTenantSchema(tenant_id, tenant)
return {
success: true,
message: "Tenant created successfully!",
data: createdTenant
}
} catch (error) {
console.log(error);
return {
success: false,
error: "Problem in creating tenant!"
}
}
}
async createTenantSchema(tenant_id: string, tenant: Tenant): Promise<void> {
await getManager().transaction(async transactionalEntityManager => {
// Step 1: Save the record
await transactionalEntityManager.save(tenant);
// Step 2: Create first table
await transactionalEntityManager.query(`
CREATE TABLE ${tenant_id}__customer(
customer_id int primary key auto_increment,
firstname varchar(255),
middlename varchar(255),
lastname varchar(255),
address varchar(255)
)`);
// Step 3: Create second table query
await transactionalEntityManager.query(`
CREATE TABLE ${tenant_id}__product (
product_id int primary key auto_increment,
product_name varchar(255)
)`);
});
}
}
Что я проверил, так это то, что я допустил некоторые синтаксические ошибки (удалил TABLE
строку из второго запроса). Но безрезультатно, запись сохраняется и создается первая таблица. Я думаю, что это нечто неожиданное для транзакций. Что я здесь упускаю?
P. S: Я использую Nestjs для бэкенда с базой данных TypeORM и MYSQL.