TypeORM - Entidade

Uma entidade é uma coleção de campos e operações de banco de dados associadas. É usado para mapear a tabela de banco de dados e seus campos com as entidades e seus atributos. Este capítulo explica sobre as entidades TypeORM em detalhes.

Introdução

Vamos criar uma classe Entity simples em nosso código. Mova para o local da raiz do seu projeto e entre na pasta src e vá para a pasta de entidade. Agora, crie um arquivo TypeScript, Student.ts e insira o código abaixo -

Student.ts

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

@Entity() 
export class Student {   

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

Aqui,

  • Entity() classe decorator é usada para representar que o Student classe é uma entidade.
  • PrimaryGeneratedColumn() a classe decorator é usada para representar que a coluna id é a coluna da chave primária do Student entidade.
  • Column() classe decorator é usada para representar outras colunas, como Name e Age do Student entidade.

Agora, classe Entity Studenté criado. TypeORM irá gerar automaticamente uma tabela correspondente aoStudent entidade em nosso banco de dados e será nomeada como student. Agora, vá parasrc/index.ts arquivo e adicione o seguinte 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));

Aqui,

  • A linha 1 - 3 importa as classes relevantes, createConnection e Student
  • A linha 5 cria uma nova conexão com o banco de dados usando createConnection e se a conexão for estabelecida, ele executa o código dentro do then quadra.
  • A linha 10 cria um novo objeto Student, stud.
  • As linhas 13-14 definem os atributos de nosso objeto prisioneiro recém-criado.
  • A linha 17 salva a entidade no banco de dados usando o método de salvamento disponível em connection.manager objeto.
  • A linha 23 busca os detalhes do aluno no banco de dados usando o método de localização disponível em connection.manager objeto.

Inicie o servidor Mysql e execute seu aplicativo

Nós criamos a entidade Student e criamos uma conexão em index.ts. Vamos iniciar o servidor MySql e seu aplicativo.

npm start

Isso retornará a seguinte saída em sua tela -

Resultado

Abrir mysql servidor seguindo student tabela é adicionada dentro de seu banco de dados.

Colunas

Conforme aprendido anteriormente, Entity é, na verdade, uma coleção de atributos. Como objeto de entidade se refere à tabela do banco de dados. Seus atributos / variáveis ​​de membro referem-se aos campos / colunas da tabela do banco de dados correspondente. TypeORM oferece suporte a todos os tipos de campos de banco de dados por meio da classe Column. Vamos aprender os diferentes tipos de coluna suportados pelo TypeORM neste capítulo.

@Column() a classe decorator é usada para representar a coluna e seu tipo na entidade.

Por exemplo, o atributo de idade da entidade do aluno e o tipo de atributo de idade podem ser definidos conforme abaixo -

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

Aqui,

  • ageé o atributo da entidade. Em outras palavras, idade é um campo / coluna na tabela do aluno no banco de dados.
  • int representam o tipo da coluna de idade no banco de dados.

TypeORM suporta quase todos os tipos disponíveis no popular mecanismo de banco de dados. Na verdade, TypeORM permite diferentes conjuntos de tipos para cada mecanismo de banco de dados. Podemos usar qualquer tipo de banco de dados compatível com nosso mecanismo de banco de dados sem nenhum problema.

Por exemplo, o tipo suportado pelo TypeORM para o mecanismo de banco de dados postgresql é o seguinte -

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

Da mesma forma, TypeORM suporta um conjunto diferente de tipos de dados para MySQL.

Opções de coluna

TypeORM fornece um amplo conjunto de opções além do tipo para descrever a coluna. Por exemplo, a opção de comprimento refere-se ao comprimento do campo do banco de dados e pode ser especificada conforme abaixo -

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

Algumas das opções de coluna mais comuns são as seguintes -

  • name - Nome do campo / coluna do banco de dados.
  • length - Comprimento do campo / coluna do banco de dados.
  • nullable - Especifique se o campo / coluna do banco de dados permite nulo ou não.
  • default - Valor padrão do campo / coluna do banco de dados.
  • primary - Especifique se o campo / coluna do banco de dados é a chave primária da tabela.
  • unique - Especifique se o campo / coluna do banco de dados é exclusivo
  • *precision** - Precisão do campo / coluna do banco de dados
  • scale - Escala do campo / coluna do banco de dados
  • comment - Comentário ou descrição do campo / coluna do banco de dados

Decorador @Generated

TypeORM fornece decorador adicional, @Generated para gerar automaticamente os valores da coluna. Por exemplo, Universally Unique Identifier (UUID) é bastante comum para usar em banco de dados para armazenar valor único em uma coluna. O código de amostra para gerar UUID é o seguinte -

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

Aqui,

uuid é gerado automaticamente e armazenado no banco de dados.

Colunas primárias

Pelo menos um campo de coluna primária é obrigatório para qualquer entidade no banco de dados. É classificado em diferentes tipos de decoradores. Vamos discutir isso um por um.

@PrimaryColumn()

O decorador @PrimaryColumn () é usado para criar uma coluna primária para qualquer tipo de dado. Um exemplo simples é mostrado abaixo,

import {Entity, PrimaryColumn} from "typeorm"; 

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

Aqui,

id é um número inteiro, que não aceita valores duplicados, mas precisamos atribuir valores.

Podemos atribuir coluna primária a um ou mais campos também, se a situação exigir.

Exemplo

import {Entity, PrimaryColumn} from "typeorm"; 

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

@PrimaryGeneratedColumn ()

@PrimaryGeneratedColumn()campo é usado para especificar a coluna primária e também para gerar automaticamente o valor da coluna no banco de dados. É mostrado abaixo -

import {Entity, PrimaryGeneratedColumn} from "typeorm"; 

@Entity() 
export class Student {

   @PrimaryGeneratedColumn() 
   id: number;
}

Aqui,

Você não precisa atribuir um valor de id; ele será gerado automaticamente pelo TypeORM na tabela do banco de dados.

@PrimaryGeneratedColumn (“uuid”)

@PrimaryGeneratedColumn também aceita um argumento para especificar o tipo de gerador. Um dos principais usos é gerar id único baseado em UUID.

import {Entity, PrimaryGeneratedColumn} from "typeorm";

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

tipo de coluna de matriz simples

O banco de dados relacional avançado oferece suporte a tipos de dados de matriz. Para suportar o tipo de dados de array, TypeORM fornece um tipo de coluna especial, * simple-array "para armazenar valores de array primitivos. Um código de exemplo para usá-lo é o seguinte -

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

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

tipo de coluna json simples

Lote de mecanismo de banco de dados moderno suporta banco de dados JSON. Para usar o tipo de dados JSON, TypeORM fornece um tipo especial, single-json. O código de amostra para usá-lo é o seguinte -

@Entity() 
export class Student { 

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

Este valor pode ser definido em index.ts como,

index.ts

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

Colunas especiais

TypeORM suporta as seguintes colunas especiais

  • @CreateDateColumn - É uma coluna especial para definir automaticamente a data de inserção da entidade.
  • @UpdateDateColumn - É usado para definir a hora de atualização da entidade automaticamente.
  • @VersionColumn - Defina o número da versão para a entidade automaticamente.

Herança de Entidade

A herança de entidades é usada para reduzir a duplicação de entidades. Considere as entidades abaixo -

Result.ts

@Entity() 
export class Result {    

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

Grade.ts

O código para grade.ts é o seguinte -

@Entity() 
export class Grade {

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

Aqui,

As duas entidades acima possuem colunas id, título e descrição. Usando a herança de entidade, criamos uma classe base Detalhes e combinamos as duas entidades acima conforme especificado abaixo.

Details.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; 
}

Agora inicie o seu servidor, você pode ver a resposta abaixo,

Agora abra seu servidor mysql e vá para seu banco de dados, você pode ver as seguintes tabelas,

Tabela de notas

Tabela de resultados