TypeORM - Entidad

Una entidad es una colección de campos y operaciones de base de datos asociadas. Se utiliza para mapear la tabla de la base de datos y sus campos con las entidades y sus atributos. Este capítulo explica en detalle las entidades TypeORM.

Introducción

Creemos una clase Entity simple en nuestro código. Vaya a la ubicación raíz de su proyecto y vaya a la carpeta src y muévase a la carpeta de la entidad. Ahora, cree un archivo TypeScript, Student.ts e ingrese el siguiente código:

Student.ts

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; 

@Entity() 
export class Student {   

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   Name: string; 
   
   @Column() 
   age: number; 
}

Aquí,

  • Entity() La clase decoradora se usa para representar que el Student la clase es una entidad.
  • PrimaryGeneratedColumn() La clase de decorador se usa para representar que la columna de identificación es la columna de clave primaria de la Student entidad.
  • Column() La clase de decorador se usa para representar otras columnas como Name y Age del Student entidad.

Ahora, clase de entidad Studentes creado. TypeORM generará automáticamente una tabla correspondiente a laStudent entidad en nuestra base de datos y será nombrada como student. Ahora, muévete asrc/index.ts archivo y agregue el siguiente código -

index.ts

import "reflect-metadata"; 
import {createConnection} from "typeorm";
import {Student} from "./entity/Student"; //import Student entity

createConnection().then(async connection => { 

   console.log("Inserting a new record into the student database..."); 
   
   //create student object const stud = new Student(); 
   
   //Assign student name and age here stud.Name = "student1"; 
   stud.age = 12; 
   
    //save student object in connection await connection.manager.save(stud); console.log("Saved a new user with id: " + stud.id);
    
    console.log("Loading users from the database...");

    //Display student saved records const students = await connection.manager.find(Student); console.log("Loaded users: ", students);

    console.log("Here you can setup and run express/koa/any other framework.");
}).catch(error => console.log(error));

Aquí,

  • La línea 1-3 importa las clases relevantes, createConnection y Student
  • La línea 5 crea una nueva conexión a la base de datos usando createConnection y si se establece la conexión, ejecuta el código dentro del then bloquear.
  • La línea 10 crea un nuevo objeto Student, stud.
  • La línea 13-14 establece los atributos de nuestro objeto de montante recién creado.
  • La línea 17 guarda la entidad en la base de datos usando el método de guardar disponible en connection.manager objeto.
  • La línea 23 obtiene los detalles del estudiante de la base de datos utilizando el método de búsqueda disponible en connection.manager objeto.

Inicie el servidor Mysql y ejecute su aplicación

Hemos creado la entidad Student y creamos conexión en index.ts. Iniciemos tanto el servidor MySql como su aplicación.

npm start

Esto devolverá la siguiente salida en su pantalla:

Salida

Abierto mysql servidor siguiendo student La tabla se agrega dentro de su base de datos.

Columnas

Como se aprendió anteriormente, Entity es en realidad una colección de atributos. Como objeto de entidad se refiere a la tabla de la base de datos. Sus atributos / variables miembro hacen referencia a los campos / columnas de la tabla de la base de datos correspondiente. TypeORM admite todo tipo de campos de base de datos a través de la clase Column. Aprendamos los diferentes tipos de columna admitidos por TypeORM en este capítulo.

@Column() La clase decorador se usa para representar la columna y su tipo en la entidad.

Por ejemplo, el atributo de edad de la entidad de estudiante y el tipo de atributo de edad se pueden definir de la siguiente manera:

@Column("int") age: integer; // OR @Column({ type: "int" }) age: integer;

Aquí,

  • agees el atributo de la entidad. En otras palabras, la edad es un campo / columna en la tabla de estudiantes en la base de datos.
  • int representan el tipo de columna de edad en la base de datos.

TypeORM admite casi todos los tipos disponibles en el popular motor de base de datos. En realidad, TypeORM habilita diferentes conjuntos de tipos para cada motor de base de datos. Podemos utilizar cualquier tipo de base de datos compatible con nuestro motor de base de datos sin ningún problema.

Por ejemplo, el tipo admitido por TypeORM para el motor de base de datos postgresql es el siguiente:

int, int2, int4, int8, smallint, integer, bigint, decimal, numeric, real, float, float4, float8, double precision, money, character varying,

varchar, character, char, text, citext, hstore, bytea, bit, varbit, bit

varying, timetz, timestamptz, timestamp, timestamp without time zone, timestamp with time zone, date, time, time without time zone, time with time zone, interval, bool, boolean, enum, point, line, lseg, box, path, polygon, circle, cidr, inet, macaddr, tsvector, tsquery, uuid, xml, json, jsonb, int4range, int8range, numrange, tsrange, tstzrange, daterange, geometry, geography, cube

De manera similar, TypeORM admite un conjunto diferente de tipos de datos para MySQL.

Opciones de columna

TypeORM proporciona un amplio conjunto de opciones distintas del tipo para describir la columna. Por ejemplo, la opción de longitud se refiere a la longitud del campo de la base de datos y se puede especificar de la siguiente manera:

@Column("varchar", { length: 100 })

Algunas de las opciones de columna más comunes son las siguientes:

  • name - Nombre del campo / columna de la base de datos.
  • length - Longitud del campo / columna de la base de datos.
  • nullable - Especifique si el campo / columna de la base de datos permite nulos o no.
  • default - Valor predeterminado del campo / columna de la base de datos.
  • primary - Especifique si el campo / columna de la base de datos es la clave principal de la tabla.
  • unique - Especifique si el campo / columna de la base de datos es único
  • *precision** - Precisión del campo / columna de la base de datos
  • scale - Escala del campo / columna de la base de datos
  • comment - Comentario o descripción del campo / columna de la base de datos

@Decorador generado

TypeORM proporciona un decorador adicional, @Generated para generar automáticamente los valores de columna. Por ejemplo, Universal Unique Identifier (UUID) es bastante común de usar en la base de datos para almacenar un valor único en una columna. El código de muestra para generar UUID es el siguiente:

@Entity() 
export class Student {
 
   @PrimaryColumn() 
   id: number; 
   
   @Column() 
   @Generated("uuid") 
   uuid: string; 
}

Aquí,

uuid se genera automáticamente y se almacena dentro de la base de datos.

Columnas primarias

Al menos un campo de columna principal es obligatorio para cualquier entidad en la base de datos. Se clasifica en diferentes tipos de decoradores. Lo discutiremos uno por uno.

@PrimaryColumn()

El decorador @PrimaryColumn () se utiliza para crear una columna principal para cualquier tipo de datos. A continuación se muestra un ejemplo simple,

import {Entity, PrimaryColumn} from "typeorm"; 

@Entity() 
export class Student {        
@PrimaryColumn() 
   id: number; 
}

Aquí,

id es un número entero, que no acepta valores duplicados, pero necesitamos asignar valores.

También podemos asignar una columna principal para uno o más campos, si la situación lo requiere.

Ejemplo

import {Entity, PrimaryColumn} from "typeorm"; 

@Entity() 
export class Student { 
   
   @PrimaryColumn() 
   id: number; 
   
   @PrimaryColumn() 
   email: string; 
   
   @PrimaryColumn() 
   phone: number; 
}

@PrimaryGeneratedColumn ()

@PrimaryGeneratedColumn()El campo se utiliza para especificar la columna principal, así como para generar automáticamente el valor de la columna en la base de datos. Se muestra a continuación:

import {Entity, PrimaryGeneratedColumn} from "typeorm"; 

@Entity() 
export class Student {

   @PrimaryGeneratedColumn() 
   id: number;
}

Aquí,

No tiene que asignar un valor de identificación; será generado automáticamente por TypeORM en la tabla de la base de datos.

@PrimaryGeneratedColumn ("uuid")

@PrimaryGeneratedColumn también acepta un argumento para especificar el tipo de generador. Uno de los usos principales es generar una identificación única basada en UUID.

import {Entity, PrimaryGeneratedColumn} from "typeorm";

@Entity() 
export class Student {  
   @PrimaryGeneratedColumn("uuid") id: string; 
}

tipo de columna de matriz simple

La base de datos relacional avanzada admite el tipo de datos de matriz. Para admitir el tipo de datos de matriz, TypeORM proporciona un tipo de columna especial, * matriz simple "para almacenar valores de matriz primitivos. Un código de muestra para usarlo es el siguiente:

@Entity() 
export class Student { 
   
   @PrimaryGeneratedColumn() 
   id: number;

   @Column("simple-array") 
   names: string[]; 
}

tipo de columna simple-json

Gran cantidad de motor de base de datos moderno es compatible con la base de datos JSON. Para usar el tipo de datos JSON, TypeORM proporciona un tipo especial, single-json. El código de muestra para usarlo es el siguiente:

@Entity() 
export class Student { 

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column("simple-json")
   info: { firstName: string, middleName: string, lastName: string }; 
}

Este valor se puede definir en index.ts como,

index.ts

const stud = new Student(); 
stud.info = { firstName: "John", middleName: "peter", lastName: "Michael" };

Columnas especiales

TypeORM admite las siguientes columnas especiales

  • @CreateDateColumn - Es una columna especial para configurar la fecha de inserción de la entidad automáticamente.
  • @UpdateDateColumn - Se utiliza para configurar el tiempo de actualización de la entidad de forma automática.
  • @VersionColumn - Establecer el número de versión de la entidad automáticamente.

Herencia de la entidad

La herencia de entidades se utiliza para reducir la duplicación de entidades. Considere las siguientes entidades:

Result.ts

@Entity() 
export class Result {    

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   title: string; 
   
   @Column() 
   description: string; 
   
   @Column() 
   eligible: string 
}

Grade.ts

El código de grade.ts es el siguiente:

@Entity() 
export class Grade {

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   name: string; 
   
   @Column() 
   title: string; 
   
   @Column() 
   description: string;
   
   
   
   @Column() 
   grading : string; 
}

Aquí,

Las dos entidades anteriores tienen columnas de identificación, título y descripción. Utilizando la herencia de entidades, creamos una clase base Detalles y combinamos las dos entidades anteriores como se especifica a continuación.

Detalles.ts

export abstract class Details {

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   title: string; 
   
   @Column() 
   description: string; 
} 
@Entity() 
export class Result extends Details{  

   @Column() 
   eligible: string 
} 
@Entity() 
export class Grade extends Details{   

   @Column() 
   name : string; 
   
   @Column() 
   grading : string; 
}

Ahora inicie su servidor, podría ver la siguiente respuesta,

Ahora abra su servidor mysql y muévase a su base de datos, puede ver las siguientes tablas,

Tabla de calificaciones

Tabla de resultados