TypeORM - Entité

Une entité est une collection de champs et d'opérations de base de données associées. Il est utilisé pour mapper la table de la base de données et ses champs avec les entités et ses attributs. Ce chapitre explique en détail les entités TypeORM.

introduction

Créons une classe Entity simple dans notre code. Accédez à l'emplacement racine de votre projet, accédez au dossier src et déplacez-vous vers le dossier d'entité. Maintenant, créez un fichier TypeScript, Student.ts et entrez le code ci-dessous -

Student.ts

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

@Entity() 
export class Student {   

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

Ici,

  • Entity() La classe decorator est utilisée pour représenter que le Student la classe est une entité.
  • PrimaryGeneratedColumn() La classe decorator est utilisée pour représenter que la colonne id est la colonne de clé primaire du Student entité.
  • Column() La classe decorator est utilisée pour représenter d'autres colonnes telles que Name et Age du Student entité.

Maintenant, classe d'entité Studentest créé. TypeORM générera automatiquement une table correspondant auStudent entité dans notre base de données et il sera nommé comme student. Maintenant, passez àsrc/index.ts fichier et ajoutez le code suivant -

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));

Ici,

  • Les lignes 1 à 3 importent les classes pertinentes, createConnection et Student
  • La ligne 5 crée une nouvelle connexion à la base de données en utilisant createConnection et si la connexion est établie, il exécute le code à l'intérieur du then bloquer.
  • La ligne 10 crée un nouvel objet Student, stud.
  • Les lignes 13-14 définissent les attributs de notre nouvel objet Stud.
  • La ligne 17 enregistre l'entité dans la base de données à l'aide de la méthode de sauvegarde disponible dans connection.manager objet.
  • La ligne 23 récupère les détails de l'élève dans la base de données à l'aide de la méthode de recherche disponible dans connection.manager objet.

Démarrez le serveur Mysql et exécutez votre application

Nous avons créé une entité Student et créé une connexion dans index.ts. Lançons à la fois le serveur MySql et votre application.

npm start

Cela renverra la sortie suivante sur votre écran -

Production

Ouvert mysql serveur suivant student table est ajoutée dans votre base de données.

Colonnes

Comme appris précédemment, Entity est en fait une collection d'attributs. Comme objet entité fait référence à la table de base de données. Ses attributs / variables membres font référence aux champs / colonnes de la table de base de données correspondante. TypeORM prend en charge tous les types de champs de base de données via la classe Column. Apprenons les différents types de colonnes supportés par TypeORM dans ce chapitre.

@Column() La classe decorator est utilisée pour représenter la colonne et son type dans l'entité.

Par exemple, l'attribut age de l'entité étudiant et le type de l'attribut age peuvent être définis comme ci-dessous -

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

Ici,

  • ageest l'attribut de l'entité. En d'autres termes, l'âge est un champ / une colonne dans la table des étudiants dans la base de données.
  • int représentent le type de la colonne d'âge dans la base de données.

TypeORM prend en charge presque tous les types disponibles dans le moteur de base de données populaire. En fait, TypeORM permet différents ensembles de types pour chaque moteur de base de données. Nous pouvons utiliser n'importe quel type de base de données pris en charge par notre moteur de base de données sans aucun problème.

Par exemple, le type pris en charge par TypeORM pour le moteur de base de données postgresql est le suivant:

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 même, TypeORM prend en charge un ensemble différent de types de données pour MySQL.

Options de colonne

TypeORM fournit un ensemble complet d'options autres que type pour décrire la colonne. Par exemple, l'option longueur fait référence à la longueur du champ de base de données et elle peut être spécifiée comme ci-dessous -

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

Certaines des options de colonne les plus courantes sont les suivantes:

  • name - Nom du champ / colonne de la base de données.
  • length - Longueur du champ / colonne de la base de données.
  • nullable - Spécifiez si le champ / colonne de la base de données autorise la valeur NULL ou non.
  • default - Valeur par défaut du champ / colonne de la base de données.
  • primary - Spécifiez si le champ / colonne de base de données est la clé primaire de la table.
  • unique - Spécifiez si le champ / colonne de la base de données est unique
  • *precision** - Précision du champ / colonne de la base de données
  • scale - Échelle du champ / colonne de la base de données
  • comment - Commentaire ou description du champ / colonne de la base de données

@Generated décorateur

TypeORM fournit un décorateur supplémentaire, @Generated pour générer automatiquement les valeurs de colonne. Par exemple, un identificateur unique universel (UUID) est assez courant à utiliser dans la base de données pour stocker une valeur unique dans une colonne. L'exemple de code pour générer l'UUID est le suivant:

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

Ici,

uuid est généré automatiquement et stocké dans la base de données.

Colonnes primaires

Au moins un champ de colonne principale est obligatoire pour toute entité de la base de données. Il est classé en différents types de décorateurs. Nous en discuterons un par un.

@PrimaryColumn()

Le décorateur @PrimaryColumn () est utilisé pour créer une colonne principale pour tout type de données. Un exemple simple est montré ci-dessous,

import {Entity, PrimaryColumn} from "typeorm"; 

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

Ici,

id est un entier, qui n'accepte pas les valeurs en double, mais nous devons attribuer des valeurs.

Nous pouvons également attribuer une colonne principale à un ou plusieurs champs, si la situation l'exige.

Exemple

import {Entity, PrimaryColumn} from "typeorm"; 

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

@PrimaryGeneratedColumn ()

@PrimaryGeneratedColumn()Le champ est utilisé pour spécifier la colonne principale ainsi que pour générer automatiquement la valeur de la colonne dans la base de données. Il est montré ci-dessous -

import {Entity, PrimaryGeneratedColumn} from "typeorm"; 

@Entity() 
export class Student {

   @PrimaryGeneratedColumn() 
   id: number;
}

Ici,

Vous n'êtes pas obligé d'attribuer une valeur d'identifiant; il sera généré automatiquement par le TypeORM dans la table de la base de données.

@PrimaryGeneratedColumn ("uuid")

@PrimaryGeneratedColumn accepte également un argument pour spécifier le type de générateur. L'une des principales utilisations est de générer un identifiant unique basé sur l'UUID.

import {Entity, PrimaryGeneratedColumn} from "typeorm";

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

type de colonne à tableau simple

La base de données relationnelle avancée prend en charge le type de données tableau. Pour prendre en charge le type de données tableau, TypeORM fournit un type de colonne spécial, * simple-array "pour stocker les valeurs de tableau primitif. Voici un exemple de code pour l'utiliser:

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

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

type de colonne simple-json

De nombreux moteurs de base de données modernes prennent en charge la base de données JSON. Pour utiliser le type de données JSON, TypeORM fournit un type spécial, single-json. L'exemple de code pour l'utiliser est le suivant -

@Entity() 
export class Student { 

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

Cette valeur peut être définie dans index.ts comme,

index.ts

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

Colonnes spéciales

TypeORM prend en charge les colonnes spéciales suivantes

  • @CreateDateColumn - C'est une colonne spéciale pour définir automatiquement la date d'insertion de l'entité.
  • @UpdateDateColumn - Il est utilisé pour définir automatiquement l'heure de mise à jour de l'entité.
  • @VersionColumn - Définissez automatiquement le numéro de version de l'entité.

Héritage d'entité

L'héritage d'entité est utilisé pour réduire la duplication d'entités. Considérez les entités ci-dessous -

Result.ts

@Entity() 
export class Result {    

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

Grade.ts

Le code pour grade.ts est le suivant -

@Entity() 
export class Grade {

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

Ici,

Les deux entités ci-dessus ont des colonnes id, title et description. En utilisant l'héritage d'entités, nous créons une classe de base Details et combinons les deux entités ci-dessus comme spécifié ci-dessous.

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

Maintenant, démarrez votre serveur, vous pouvez voir la réponse ci-dessous,

Maintenant, ouvrez votre serveur mysql et passez à votre base de données, vous pouvez voir les tableaux suivants,

Tableau des notes

Tableau des résultats