TypeOrm - Usando Vistas
PUBLICADO EL 12 Nov 2020, POR VICTOR CORNEJO
Todos nos hemos alegrado cuando descubrimos los ORM's por la facilidad con la que podemos acceder a la base de datos. Con el tiempo nuestras aplicaciones empiezan a volverse mas complejas y mas de alguna vez hemos llegado a la conclusión que debemos ejecutar una sentencia SQL en modo crudo ( Raw SQL Queries ).
TypeORM te permite crear una vista desde el código de programación y acceder a la misma sin necesidad de ejecutar de forma Raw la sentencia.

Beneficios

  • Control de los cambios, definitivamente si la vista se define desde el código de programación no nos tenemos que preocupar por saber cual es la ultima versión de esa vista.
  • No tenemos que manejar diferentes complementaciones para cada base de datos; si tuviéramos que hacerlo, basta con ajustar la generación del "Query" que describe la vista.
  • Fácil de implementar y comprensión para los programadores que le den soporte.
La forma de implementar es sencilla y semejante a la definición de las tablas o "entities".

Paso 1. Definición de la Vista.

Las @ViewEntity() son clases que permiten acceder a las vistas de nuestra base de datos.
1
// Definicion del query que invocara la vista. Ejemplo para POSTGRESQL
2
const query = `SELECT a.id, a.name, a.email from public.users a`
3
4
@ViewEntity({
5
schema: 'public',
6
name: 'vw_user_info',
7
expression: query
8
})
9
export class UserInfoView {
10
@ViewColumn( { name: 'id' })
11
id: number;
12
13
@ViewColumn( { name: 'name' })
14
name: string;
15
16
@ViewColumn( { name: 'email' })
17
email: string;
18
}
19
Copied!

Paso 2. Definición del Repositorio.

1
import { Connection } from 'typeorm';
2
import { UserInfoView } from '../views/user.info.view';
3
4
export const UserInfoViewRepository = [{
5
provide: 'USER_INFO_VIEW_REPOSITORY',
6
useFactory: (connection: Connection) =>
7
connection.getRepository(UserInfoView),
8
inject: ['DATABASE_CONNECTION']
9
}
10
]
Copied!

Paso 3. Utilización del repositorio en un servicio.

1
import { Inject, Injectable } from '@nestjs/common';
2
3
@Injectable()
4
export class UserInfoService {
5
6
constructor(
7
@Inject('USER_INFO_VIEW_REPOSITORY')
8
private userInfoRepository: Repository<UserInfoView>
9
) {}
10
11
public findByEmail(email: string): Promise<UserInfoView) {
12
const condition: {
13
where: {
14
email: email
15
}
16
};
17
18
return this.userInfoRepository.findOne(condition);
19
}
20
}
Copied!

Última actualización 1yr ago