Copyright HébergementWebs.com - License GPL

TypeORM - Guide rapide

Tutoriel typeorm   2020-11-17 05:55:31

TypeORM - Introduction Le framework TypeORM est un framework Object Relational Mapping (ORM) . En général, la partie Objet fait référence au domaine / modèle de votre application, la partie Relationnelle fait référence à la relation entre les tables dans Relational Database Management System (par exemple, Oracle, MySQL, MS- SQL, PostgreSQL, etc.) et enfin la partie Mapping fait référence à l"acte de ponter le modèle et nos tables. ORM est un type d"outil qui mappe des entités avec des tables de base de données . ORM fournit un processus de développement simplifié en automatisant la conversion objet en table et table en objet. Une fois que vous pouvez écrire votre modèle de données en un seul endroit, il devient plus facile de mettre à jour, de maintenir et de réutiliser le code. Étant donné que le modèle est faiblement lié au reste de l"application, vous pouvez le modifier sans toute dépendance dure avec une autre partie de l"application et peut être facilement utilisée n"importe où dans l"application. TypeORM est très flexible, éloigne le système DB de l"application et nous permet de bénéficier de l"utilisation du concept OOPS. Vue d"ensemble TypeORM est une bibliothèque Object Relational Mapper fonctionnant dans node .js et écrit en TypeScript. TypeScript est une amélioration de JavaScript avec une saisie facultative. TypeScript est un langage compilé. Il n"est pas interprété au moment de l"exécution. Le compilateur TypeScript prend les fichiers TypeScript (.ts) et les compile en fichiers JavaScript (.js). TypeORM prend en charge plusieurs bases de données comme MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana et WebSQL. TypeORM est un ORM facile à utiliser pour créer de nouvelles applications qui se connectent aux bases de données. La fonctionnalité TypeORM est un concept spécifique au SGBDR. Nous pouvons créer rapidement de nouveaux projets et micro-services. Il est inspiré d"un outil similaire comme Hibernate, Doctrine, Entity Framework, etc., d"autres langages de programmation. Fonctionnalités de TypeORM TypeORM est livré avec les fonctionnalités suivantes - Création automatique Schémas de table de base de données basés sur vos modèles. Insérez, mettez à jour et supprimez facilement des objets dans la base de données. Créez un mappage (un à un, un à plusieurs et -to-many) entre les tables. Fournit des commandes CLI simples. Avantages de TypeORM TypeORM est un framework ORM facile à utiliser avec codage. Il présente les avantages suivants: Applications de haute qualité et faiblement couplées. Applications évolutives. Intégration facile avec d"autres modules. S"adapte parfaitement à toute architecture, des petites applications aux applications d"entreprise. TypeORM - Installation Ce chapitre explique comment installer TypeORM sur votre machine. Avant de passer à l"installation, veuillez vous assurer que npm est installé. Pour confirmer que vous avez npm, vous pouvez exécuter la commande suivante dans votre terminal. npm -v Il montre la version. S"il n"est pas installé, téléchargez la dernière version et installez sur votre machine. Installez TypeORM Installons TypeORM localement en utilisant le module npm - npm install typeorm --save Après avoir exécuté la commande ci-dessus, vous obtiendrez une réponse comme indiqué ci-dessous - + typeorm@0.2.24 + ajouté 1 package et audité 1236 packages dans 4.729s Alternativement, pour installer TypeORM globalement, utilisez la commande ci-dessous - npm install typeorm -g Après cela, installez le paquetage facultatif reflect-span data en utilisant npm - npm install reflect-span data --save Vous pouvez voir la réponse suivante - + reflect-span data@0.1.13 a ajouté 1 package et audité 1236 packages dans 2.426s Maintenant, installez un autre package optionnel. les types de nœuds en utilisant la commande ci-dessous - npm install @ types / node --save Vous pouvez voir la réponse suivante - + @ types / node @ 12.12.31 ajouté 1 package et audité 1236 packages dans 2.167s Installer le pilote de base de données Dans cette section, laissez-nous installer les packages de nœuds nécessaires pour notre base de données. Pour installer le package MySQL ou MariaDB , utilisez la commande ci-dessous - npm install mysql --save Vous pouvez voir la réponse suivante - + mysql@2.18.1 ajouté 1 package et audité 1236 packages en 4.36s Pour installer le package PostgreSQL , utilisez la commande ci-dessous - npm install pg --save Vous pouvez voir la réponse suivante - + pg@7.18.2 a ajouté 1 paquet et vérifié 1236 paquets en 2.863s Pour installer le package SQLite , utilisez la commande ci-dessous - npm install sqlite3 --save Vous pouvez voir la réponse suivante - + sqlite3@4.1.1 a ajouté 48 packages de 45 contributeurs et vérifié 1396 packages dans la version 7.31 Pour installer le package Microsoft SQL Server , utilisez la commande ci-dessous - npm install mssql --save Votre écran ressemble à ceci, + mssql@6.2.0 a ajouté 1 package et vérifié 1655 packages dans 2.378s Pour installer le package sql.js , utilisez la commande ci-dessous - npm install sql.js --save Vous pouvez voir la réponse suivante - + sql.js @ 1.2.1 a ajouté 1 package et vérifié 1655 packages dans 6.462s Pour installer le package serveur Oracle , utilisez la commande ci-dessous - npm install oracledb --save Vous pouvez voir la réponse suivante - + oracledb@4.2.0 a ajouté 1 package et audité 1655 paquets dans 2.265s Vers ins tall mongodb package, utilisez la commande ci-dessous - npm install mongodb --save Vous pouvez voir la réponse suivante - + mongodb@3.5.5 a ajouté 1 package et audité 1655 packages en 3.716s TypeORM - Création d"un projet simple Ce chapitre explique comment créer une application TypeORM simple. Créons un nouveau répertoire nommé "TypeORM" et allons dans le répertoire. cd / chemin / vers / TypeORM / Syntaxe Utilisez la commande ci-dessous pour créer un nouveau projet - typeorm init --name --database Exemple typeorm init --name FirstProject --database mysql Here, FirstProject est le nom de votre projet et sqlite3 est le nom de la base de données. Après avoir exécuté la commande ci-dessus, vous pouvez voir la réponse suivante, Projet créé dans le répertoire / chemin / vers / TypeORM / FirstProject Maintenant, déplacez dans notre répertoire de projet et installez les dépendances de projet à l"aide du module npm , $ cd FirstProject $ npm install Structure du projet Comprenons la structure du projet de notre nouveau projet, FirstProject . FirstProject ├──> src│├──>entité││└──>User.ts│├──>migration│└──>index.ts├──>node_modules├──>ormconfig.json├──>package.json├──>package-lock.json└──>tsconfig.jsonIci, src-contientlecodesourcedevotreapplicationenlangageTypeScript.Ilaunfichierindex.tsetdeuxsous-répertoiresentityetmigration.index.ts-Votrepointd"entréeversl"application.entité-Contientdesmodèlesdebasededonnées.migration-contientlamigrationdebasededonnéescode.node_modules-modulesnpmenregistréslocalement.ormconfig.json-Fichierdeconfigurationprincipaldevotreapplication.Ilcontientlesdétailsdeconfigurationdelabasededonnéesetlaconfigurationdesentités.package.json-Contientlesdépendancesdumoduledenœud.package-lock.json-Fichiergénéréautomatiquementetliéàpackage.json.tsconfig.json-ContientlesoptionsducompilateurspécifiquesàTypeScript.fichierormconfig.jsonVérifionsl"optiondeconfigurationdisponiblepournotreapplication.Ouvrezlefichierormconfig.jsonetilressembleàceci- { "type ": "mysql ", "host ": "localhost ", " port ": 3306, " nom d"utilisateur ": " test ", " mot de passe ": " test ", " base de données ": " test ", " synchroniser ": true, " logging ": false, " entités ": [" src/entity/**/*.ts"],"migrations":[" src/migration/**/*.ts"],"abonnés":[" src/abonné/**/*.ts"],"cli":{"entityDir":" src/entity","migrationsDir":" src/migration","abonnésDir":" src/abonné}}Here,type,hôte,nomd’utilisateur,motdepasse,basededonnéesetlesoptionsdeportsontliésàlaconfigurationdelabasededonnées.mysqlpeutêtreconfiguréenutilisantlaconfigurationci-dessous- { "type ": "mysql ", "host ": "localhost ", " port ": 3306, " username ": " db_username ", " password ": " db_password ", " database ": " db_name "} entités - fait référence à la loc ation de vos classs d"entité. migrations - fait référence à l"emplacement de vos classs de migration. abonnés - fait référence à l"emplacement de vos classs d"abonnés. cli - fait référence à l"option utilisée par TypeORM CLI pour générer automatiquement le code Démarrez le serveur MySql Avant de démarrer l"application, démarrez votre serveur MySQL ou tout serveur de base de données que vous utilisez et assurez-vous qu"il fonctionne correctement. Exécutez ap plication Une fois que tout est configuré, nous pouvons exécuter l"application en utilisant la commande ci-dessous - npm start Vous pourriez voir la réponse suivante - > FirstProject@0.0.1 start /Users/../../TypeORM/p> ts-node src/index.tsInsertiond"unnouveauutilisateurdanslabasededonnées...Enregistrementd"unnouvelutilisateuravecl"ID:1Chargementdesutilisateursdepuislabasededonnées...Utilisateurschargés:[User{id:1,firstName:"Timber",lastName:"Saw",age:25}]Ici,vouspouvezconfigureretexécuterexpress/koa/toutautreframework.L"applicationainséréunnouvelutilisateurdanslabasededonnées,puislechargeàreboursdepuislabasededonnéesetafficheenfinl"utilisateurchargédanslaconsole.NousavonsréussiàcréerunenouvelleapplicationTypeORM,àlaconfigureretàexécuterl"application.Nousdiscuteronsdelamanièredontlesdonnéessontexécutéesdemanièreélaboréedanslesprochainschapitres.TypeORM-APIdeconnexionPourinteragiraveclabasededonnées,nousavonsbesoind"unobjetdeconnexionàlabasededonnées.Nousdevonscréerunobjetdeconnexionavantdefairel"opérationdebasededonnéesetymettrefinunefoisquelesopérationsdebasededonnéessontterminées.Découvronsl"APIdeconnexionfournieparTypeORMdanscettesection.Créationd"unenouvelleconnexionAvantdecréerunenouvelleconnexion,nousdevonsconfigurerlesdétailsdeconnexionàlabasededonnéesdansormconfigFichierdeconfiguration.json.Unexemplededétailsdeconnexionestprésentéci-dessous-ormconfig.json {name: "firstconnection ", tapez : "mysql ", hôte: "localhost ", port: 3306, nom d"utilisateur: "root ", mot de passe: "root ", base de données: "firstDB "} Ici, nom - Nom de la connexion à la base de données. type - Type de base de données. hôte - Nom d"hôte du serveur de base de données. port - Port du serveur de base de données. username - Nom du compte ayant accès à la base de données. mot de passe - Mot de passe du compte mentionné ci-dessus. database - Nom de la base de données à connecter. createConnection CreateConnection est fournie par TypeORM pour créer une nouvelle connexion. Il est défini comme ci-dessous, import {createConnection, Connection} from "typeorm connexion const = attendre createConnection ({}); Ici, createConnection utilisera les détails de configuration spécifiés dans le fichier ormconfig.json. Alternativement, vous pouvez définir l"URL de connexion en tant qu"arguments de createConnection méthode comme spécifié suit - const connection = createConnection ({type: "mysql ", url: "localhost: 8888 / firstDB "}) Ici, createConnection renvoie un objet, qui peut être utilisé pour ouvrir / fermer la connexion à la base de données. Connexions multiples TypeORM fournit également une option pour créer une connexion à plusieurs bases de données. Tout d"abord, le fichier de configuration ormconfig.json peut être utilisé pour spécifier les détails de la connexion à plusieurs bases de données. Configurons plusieurs bases de données dans ormconfig.json comme indiqué ci-dessous, ormconfig.json {name: " firstconnection ", tapez: " mysql ", hôte: " localhost ", port: 3306, nom d"utilisateur: " root ", mot de passe: " root ", base de données: " firstDB "}, { nom: "secondconnection ", type: "mysql ", hôte: "localhost ", port: 3306, nom d"utilisateur: "root ", mot de passe: "root ", base de données: "secondDB "}, {nom: " troisième connexion ", tapez: " mysql ", hôte: " localhost ", port: 3306, nom d"utilisateur: " root ", mot de passe: " root ", base de données: "thirdDB "} Maintenant, nous pouvons utiliser l"argument fourni par la méthode createConnection pour spécifier le nom de la connexion pour créer l"objet de connexion comme mentionné ci-dessous - const firstconnection: Connection = wait createConnection (" firstconnection "); Ici , cr eateConnection utilisera les détails de configuration de la première connexion spécifiée dans le fichier ormconfig.json pour créer l"objet de connexion. TypeORM fournit également encore une autre API, createConnections pour créer plusieurs connexions en une seule fois, puis utilisez-la chaque fois que nécessaire comme spécifié ci-dessous - import {createConnections, Connection} from "typeorm connexions const: Connection = attendre createConnections (); Here , connexions contiennent tous les objets de connexion sous forme de tableau. ConnectionManager TypeORM aussi fournit une autre API, connectionManager pour créer une connexion. Il est défini ci-dessous - import {getConnectionManager, ConnectionManager, Connection} from "typeorm const connectionManager = getConnectionManager (); connexion const = connectionManager.create ({}); attendre connection.connect (); TypeORM préfère l"utilisation de createConnection plutôt que ConnectionManager pour créer des objets de connexion. TypeORM - Entity Une entité est un ensemble 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 class Entity simple dans notre code. Accédez à l"emplacement racine de votre projet, accédez au dossier srcetdéplacez-vousversledossierd"entité.Maintenant,créezunfichierTypeScript,Student.tsetentrezlecodeci-dessous-Student.ts import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Classe d"exportation @Entity () Étudiant {@PrimaryGeneratedColumn () id: number; @Column () Nom: chaîne; @Column () age: nombre; } Ici, Entity () la class décoratrice est utilisée pour représenter que la class Student class est une entité. PrimaryGeneratedColumn () la class de décorateur est utilisée pour représenter que la colonne id est la colonne de clé primaire de l"entité Student . Column () la class de décorateur est utilisée pour représenter d"autres colonnes telles que Nom et Âge de l"entité Student . Maintenant, class d"entité Student est créé. TypeORM générera automatiquement une table correspondant à l"entité Student dans notre base de données et elle sera nommée student . Maintenant, passez au fichier src/index.tsetajoutezlecodesuivant-index.ts import "refléter les métadonnées import {createConnection} de "typeorm import {Student} from "./ entity / Student // importation de l"entité Student createConnection (). then ( connection => {console.log ( "Insertion d"un nouvel enregistrement dans la base de données des étudiants ... "); // création de l"objet étudiant const stud = new Student (); // Attribuez ici le nom et l"âge de l"étudiant stud.Name = "student1 stud.age = 12; // enregistre l"objet étudiant dans la connexion en attente de connection.manager.save (stud); console.log ( "A enregistré un nouveau utilisateur avec id: "+ stud.id); console.log (" Chargement des utilisateurs depuis la base de données ... "); // Afficher les enregistrements enregistrés des étudiants const étudiants = attendre connection.manager.find (Student); console .log ( "Utilisateurs chargés: ", étudiants); console.log ( "Ici, vous pouvez configurer et exécuter express / koa / tout autre framework. ");}). catch (error => console.log ( Erreur)); Ici, Ligne 1 - 3 importe les classs 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, elle exécute le code à l"intérieur du bloc puis . La ligne 10 crée un nouvel objet Student, stud. La ligne 13-14 définit les attributs de notre nouvel objet Stud. La ligne 17 enregistre l"entité dans le base de données en utilisant la méthode de sauvegarde disponible dans l"objet connection.manager . La ligne 23 récupère les détails de l"étudiant dans la base de données en utilisant la méthode de recherche disponible dans connexion. manager . Démarrez le serveur Mysql et exécutez votre application Nous avons créé une entité Student et créé une connexion dans index.ts. Commençons à la fois le serveur MySql et votre application. npm start Cela renverra la sortie suivante sur votre écran - Sortie Le serveur ouvert mysql suivant la table étudiant est ajouté 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 class Column. Apprenons les différents types de colonnes supportées par TypeORM dans ce chapitre. @Column () la class 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 " ) âge: entier; // OU @Column ({type: "int "}) age: integer; Ici, age est l"attribut de l"entité. En d"autres termes, l"âge est un champ / une colonne dans la table des élèves de la base de données. int représente 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, int 2, int4, int8, smallint, integer, bigint, decimal, numeric, real, float, float4, float8, double precision, money, character variant, varchar, character, char, text, citext, hstore, bytea, bit, varbit, bit variant, timez, timestamptz, horodatage, horodatage sans fuseau horaire, horodatage avec fuseau horaire, date, heure, heure sans fuseau horaire, heure avec fuseau horaire, intervalle, booléen, booléen, enum, point, ligne, lseg, boîte, chemin , polygon, circle, cidr, inet, macaddr, tsvector, tsquery, uuid, 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 length fait référence à la longueur du champ de base de données et peut être spécifiée comme ci-dessous - @Column ( "varchar ", {length: 100}) Certaines des options de colonne les plus courantes sont les suivantes - nom - Nom du champ de base de données / colonne. 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 null ou non. default - Valeur par défaut du champ / colonne de base de données. primaire - Spécifiez si le champ de base de données / column 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 base de données échelle - Échelle du champ / colonne base de données commentaire - Commentaire ou deion du champ / colonne de la base de données @Generated decorator TypeORM fournit des d ecorator, @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 ws - @Entity () export class Student {@PrimaryColumn () id: number; @Column () @Generated ( "uuid ") uuid: string; } Here, 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 Classe d"exportation @Entity () Étudiant {@PrimaryColumn () id: nombre; } Here, 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 Classe d"exportation @Entity () Étudiant {@PrimaryColumn () id: nombre; @PrimaryColumn () email: chaîne; @PrimaryColumn () téléphone: numéro; Le champ} @PrimaryGeneratedColumn() @PrimaryGeneratedColumn () 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 Classe d"exportation @Entity () Étudiant {@PrimaryGeneratedColumn () id: number; } Here, 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 utilisations principales est de générer un identifiant unique basé sur l"UUID. import {Entity, PrimaryGeneratedColumn} from "typeorm Exportation @Entity () 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. Un exemple de code pour l"utiliser est le suivant - @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 suit: index.ts const stud = new Student (); stud.info = {firstName: "John ", middleName: "peter ", lastName: "Michael "}; Colonnes spéciales TypeORM suppo rts 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éfinit automatiquement le numéro de version de l"entité. Héritage d"entités L"héritage d"entités 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 () titre: chaîne; @Column () deion: chaîne; @Column () éligible: string} Grade.ts Le code pour grade.ts est le suivant - Classe d"exportation @Entity () Grade {@PrimaryGeneratedColumn () id: nombre; @Column () nom: chaîne; @Column () titre: chaîne; @Column () deion: chaîne; @Column () notation: chaîne; } Here, Les deux entités ci-dessus ont des colonnes id, title et deion. En utilisant l"héritage d"entités, nous créons une class de base Details et combinons les deux entités ci-dessus comme spécifié ci-dessous. Details.ts export abstract class Details { @PrimaryGeneratedColumn () id: nombre; @Column () titre: chaîne; @Column () deion: chaîne; } Classe d"exportation @Entity () Résultat étend Détails {@Column () éligible: chaîne} Classe d"exportation @Entity () Grade étend Détails {@Column () nom: chaîne; @Column () notation: chaîne; } Maintenant, démarrez votre serveur, vous pouvez voir la réponse ci-dessous, Maintenant, ouvrez votre serveur mysql et déplacez-vous vers votre base de données, vous pouvez voir les tableaux suivants, Tableau des notes Tableau de résultats TypeORM - Relations Les relations sont utilisées pour faire référence à la relation entre table dans la base de données. En général, une relation existe entre deux tables lorsque l"une d"elles a une clé étrangère qui fait référence à la clé primaire de l"autre table. Cette fonctionnalité rend la base de données relationnelle plus puissante et stocke efficacement les informations. TypeORM permet aux entités d"être liées les unes aux autres et par la suite aux tables de la base de données. En général, les relations peuvent être classées en quatre catégories plus larges. Ils sont les suivants, one-to-one - Un objet de l"entité donnée se rapporte à un seul objet de l"entité cible et vic et versa. Par exemple, un pays n"aura qu"une seule capitale et de même une ville sera la capitale d"un seul pays. plusieurs-à-un - Plusieurs objets de l"entité donnée sont liés à un objet de l"entité cible. Par exemple, une ville n"appartient qu"à un seul pays, mais le pays peut avoir plusieurs villes. un-à-plusieurs - Identique à plusieurs-à-un, sauf que la relation est inversée. plusieurs-à-plusieurs - Plusieurs objets de l"entité donnée se rapportent à plusieurs objets de l"entité cible. Par exemple, un article peut être étiqueté sous plusieurs sujets comme le langage de programmation, la finance, etc., et en même temps une balise particulière peut également avoir plusieurs articles. TypeORM fournit également des options pour améliorer la relation des entités. Ils sont les suivants - désireux - L"objet entité source charge également les objets entité cible. cascade - L"objet entité cible est inséré ou mis à jour pendant que l"objet entité source est inséré ou mis à jour. onDelete - Les objets entité cible sont également supprimés pendant que le L"objet entité source est supprimé. primaire - Utilisé pour spécifier que la colonne de relation est une clé primaire ou non. nullable - Utilisé pour spécifier que la colonne de relation est nullable ou non. Passons en revue différents types de mappage de relation en détail. One-to-One Comme nous l"avons appris précédemment, il est référencé par l"instance d"un champ de table contenant l"instance d"un autre champ de table et vice versa. Créons un tableau Details - Details.ts import {Entity, PrimaryGeneratedColumn, Column} from " typeorm Détails de la class d"exportation @Entity () {@PrimaryGeneratedColumn () id: number; @Column () gender: string; @Column () country: chaîne; } Créons une autre entité Customer comme suit - Customer.ts import {Entity, PrimaryGeneratedColumn, C olumn, OneToOne, JoinColumn} de "typeorm import {Détails} de "./ Détails Classe d"exportation @Entity () Client {@PrimaryGeneratedColumn () id: number; @Column () nom: chaîne; @OneToOne (type => Détails) @JoinColumn () détails: Détails; } Ici , Nous avons ajouté le mappage de OneToOne à la table Détails . @JoinColumn () contient un «id de relation» et une clé étrangère vers la table Client . Nous pouvons enregistrer la relation dans index.ts comme suit - const details = new Details (); details.gender = "femme details.country = "inde " attend connection.manager.save (détails); client const = nouveau client (); customer.name = "client1 "; customer.details = Détails; attendre connection.manager.save (client); Un-à-plusieurs et plusieurs-à-un Comme nous l"avons appris précédemment, il est référencé par l"instance du premier champ de table contenant les multiples instances du deuxième champ de table appelé Le mappage un-à-plusieurs et plusieurs instances de la première table ne contiennent qu"une seule instance de la deuxième table appelée mappage plusieurs-à-un . Prenons un exemple des entités Student et project alors que l"étudiant peut travailler sur plus d"un projet mais chaque projet est géré par un seul étudiant. Créons un Projet entité comme suit - Projet import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm " ; import {Student} from "./ Student Classe d"exportation @Entity () Project {@PrimaryGeneratedColumn () id: number; Projets @Column (): chaîne; @ManyToOne (type => Student, student => student.projects) étudiant: Student; } Maintenant, nous créons l"entité Student comme ci-dessous - import {Entity, PrimaryGeneratedColumn, Column, OneToMany} à partir de "typeorm import {Projet} de "./ Projet Classe d"exportation @Entity () User {@PrimaryGeneratedColumn () id: number; @Column () nom: chaîne; @OneToMany (type => P roject, project => project.student) projets: Projet ; } Here, Propriété @OneToMany mappée Project et propriété @ManyToOne mappée sur Élève . Cependant, @OneToMany ne peut pas exister sans la propriété @ManyToOne et @ManyToOne contenant «id relation» et une clé étrangère. Nous pouvons enregistrer la connexion dans index.ts comme suit - const proj1 = new Project (); proj1.projects = "gestion de la base de données attendre connection.manager.save (proj1); const proj2 = nouveau projet (); proj2.projects = "application Web attendre connection.manager.save (proj2); const stud = new Student (); stud.name = "Etudiant1 stud.projects = [proj1, proj2]; attendre connection.manager.save (stud); Many-to-Many Comme nous l"avons appris précédemment, il est référencé par plusieurs enregistrements dans une table sont liés à plusieurs enregistrements dans une autre table. Prenons un exemple, un étudiant universitaire peut être inscrit à plusieurs cours à la fois, ce qui signifie que l"étudiant peut avoir quatre ou cinq cours par semestre et qu"une class peut avoir plusieurs étudiants. Nous pouvons simplement conclure qu"un étudiant en a beaucoup classs, et une class a de nombreux étudiants. Créons une entité pour Classes comme suit - import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Classe d"exportation @Entity () Classes {@PrimaryGeneratedColumn () id: number; @Column () nom: chaîne; } Maintenant, nous créons l"entité Student comme ci-dessous - import {Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } de "typeorm import {Classes} from "./ Classes Classe d"exportation @Entity () Étudiant {@PrimaryGeneratedColumn () id: number; @Column () nom: chaîne; @Column () sujets: chaîne; @ManyToMany (type => Classes) @JoinTable () classs: Classes ; } TypeORM - Utilisation du référentiel Le référentiel est spécifique à une entité. En d"autres termes, chaque entité aura son propre, référentiel intégré et il est accessible à l"aide de la méthode getRepository () de l"objet de connexion comme spécifié ci-dessous - const studRepository = manager.getRepository (Student); Une fois que l"objet référentiel étudiant est créé, il peut être utilisé pour effectuer toutes les opérations de base de données de l"objet étudiant. Types de référentiel Référentiel est classé en quatre catégories. Ils sont les suivants - Référentiel Dépôt par défaut d"une entité et il est accessible en utilisant la méthode getRepository () comme spécifié ci-dessous - const studRepository = manager.getRepository (Student); Désormais, studRepository peut être utilisé pour interroger la table des élèves TreeRepository Utilisé pour les entités de type arborescence et il est accessible en utilisant la méthode getTreeRepository () comme spécifié ci-dessous - const studcaRepository = manager.getTreeRepository (Student); MongoRepository Utilisé dans les entités d"opération mongoDB et il est accessible en utilisant la méthode getMongoRepository () comme spécifié ci-dessous - const detailsRepository = manager.getMongoRepository (Détails); CustomRepository Utilisé pour personnaliser le référentiel et il est accessible en utilisant la méthode getCustomRepository () comme spécifié ci-dessous, const myUserRepository = manager.getCustomRepository (UserRepository); Repository API Apprenons la méthode la plus importante d"EntityManager dans ce chapitre. manager Nous pouvons accéder à EntityManager en utilisant la méthode du gestionnaire comme spécifié ci-dessous - const manager = repository.manager; queryRunner La méthode queryRunner retourne un objet d"exécution de requête personnalisé et il est utilisé pour les opérations de base de données par référentiel. L"exemple de code est le suivant - const queryRunner = repository.queryRunner; span data span data renvoie les métadonnées du référentiel. L"exemple de code est le suivant - const span data = repository.span data; query query exécute des requêtes SQL. Requête de sélection simple comme indiqué ci-dessous - const qur = wait repository.query (`select * from Students`); La méthode insert insert est utilisée pour insérer une nouvelle entité ou un nouveau tableau d"entités dans la base de données. L"exemple de code est le suivant - wait repository.insert ({Name: "Student3 ", Age: 14}); La requête ci-dessus équivaut à, insert into student (Name, age) values ​​( "Student3 ", 14) update update est utilisé pour mettre à jour les enregistrements existants dans la base de données. wait repository.update (1, {Nom: "Adam "}); Cette requête fonctionne de manière similaire à celle mentionnée ci-dessous - update student SET Name = "Adam " where id = 1 La méthode delete delete supprimera l"enregistrement spécifié de la table, attend repository.delete (Student , 1); Cela supprimera l"élève avec l"ID 1 du tableau étudiant . Cela équivaut à, delete from student where id = 1; Si vous souhaitez supprimer par nom, utilisez la requête ci-dessous, wait repository.delete ({Name: "Student1 "}) ; Cette requête supprimera tous les étudiants ayant le nom, Student1 ** softSupprimer et restaurer ** Il est utilisé pour soft supprimer les données et vous pouvez restaurer l"enregistrement basé sur l"id de l"étudiant. L"exemple de code est le suivant - wait repository.softDelete (1); Vous pouvez restaurer le dossier de l"élève en utilisant la comm ci-dessous et - attend repository.restore (1); Une autre option pour supprimer et restaurer est d"utiliser les méthodes softRemove et recover . L"exemple de code est le suivant - // trouver les entités const enty = wait repository.find (); // const entySoftRemove d"entité supprimée logicielle = attendre repository.softRemove (enty); Et, vous pouvez les récupérer en utilisant la méthode de récupération comme spécifié ci-dessous, wait repository.recover (entySoftRemove); save save est utilisé pour sauvegarder l"entité donnée dans la base de données. L"entité Student simple peut être enregistrée comme indiqué ci-dessous - import {Student} from "./ entity / Student createConnection (). then ( connection => {console.log ( "Insertion d"un nouvel enregistrement dans la base de données des étudiants ... "); const stud = new Student (); stud.Name = "student1 stud.age = 12; await repository.save (stud); Cela ajoutera un nouvel enregistrement d"élève dans la base de données. remove remove est utilisé pour supprimer l"entité donnée de la base de données. L"entité Simple Student peut être supprimée comme indiqué ci-dessous - wait repository.remove (stud); count count renvoie le nombre d"enregistrements disponibles dans la table et vous pouvez l"utiliser à des fins de pagination. L"exemple de code est le suivant - const cnt = wait repository.count (Student, {age: 12}); find find est utilisée à des fins de recherche. Elle récupère tous les enregistrements de la base de données comme indiqué ci-dessous - const result = await repository.find ({id: 1}); findOne Sim ilar à la méthode find , mais renvoie le premier enregistrement correspondant. L"exemple de code est le suivant - const result = wait repository.findOne ({id: 1}); clear clear méthode clea rs toutes les données de la table. L"exemple de code est le suivant - await repository.clear (); TypeORM - Travailler avec Entity Manager EntityManager est similaire à Repository et utilisé pour gérer les opérations de base de données telles que l"insertion, la mise à jour , supprimer et charger des données. Alors que Repository gère une seule entité, EntityManager est commun à toutes les entités et peut effectuer des opérations sur toutes les entités. API Entity Manager Nous pouvons accéder à EntityManager en utilisant la méthode getManager () comme spécifié ci-dessous - import {getManager} depuis "typeorm const entityManager = getManager (); Apprenons la méthode la plus importante d"EntityManager dans ce chapitre. connection connection méthode renvoie la connexion ORM de la base de données à une bases de données. L"exemple de code est le suivant - const connection = manager.connection; QueryRunner La méthode queryRunner retourne un objet d"exécution de requête personnalisé et il est utilisé pour les opérations de base de données par le gestionnaire d"entités. L"exemple de code est le suivant - const queryRunner = manager.queryRunner; transaction Si plusieurs requêtes de base de données sont appelées, la transaction s"exécutera dans une seule transaction de base de données. L"exemple de code pour obtenir la transaction est le suivant - wait manager.transaction ( manager => {}); La méthode query query exécute des requêtes SQL. Requête d"insertion simple comme indiqué ci-dessous - const qur = wait manager.query (`insert into student (name, age) values ​​( "stud2 ", 13)` ); La méthode insert insert est utilisée pour insérer une nouvelle entité ou un nouveau tableau d"entités dans la base de données. L"exemple de code est le suivant - wait manager.insert (Student, {Name: "Student3 ", Age: 14}); update update est utilisé pour mettre à jour les enregistrements existants dans la base de données. wait manager. update (Utilisateur, 1, {Nom: "Adam "}); Cette requête fonctionne de manière similaire à la requête SQL ci-dessous, UPDATE student SET Name = "Adam " WHERE id = 1 delete La méthode de suppression supprimera l"enregistrement spécifié de la table, wait manager.delete (Student, 1); Ceci supprimera avec l"ID 1 de la fiche de l"élève. save save est utilisé pour enregistrer l"entité donnée dans la base de données . L"entité Student simple peut être enregistrée comme indiqué ci-dessous - import {Student} from "./ entity / Student createConnection (). then ( connection => {console.log ( "Insertion d"un nouvel enregistrement dans la base de données des étudiants ... "); const stud = new Student (); stud.Name = "student1 stud.age = 12; await connection.manager.save (stud);} Ceci ajoutera un nouvel enregistrement d"étudiant dans la base de données. save méthode insérera l"étudiant, si l"étudiant donné n"existe pas dans le base de données. Sinon, enregistrer mettra à jour l"enregistrement étudiant existant dans la base de données. remove remove est utilisé pour supprimer l"entité donnée de la base de données. Simple Student l"entité peut être supprimée comme indiqué ci-dessous - wait manager.remove (stud); count count renvoie le nombre d"enregistrements disponibles dans la table et vous pouvez l"utiliser à des fins de pagination. L"exemple de code est le suivant - const cnt = wait manager .count (Student, {age: 12}); find La méthode find est utilisée à des fins de recherche. s tous les enregistrements de la base de données comme indiqué ci-dessous - console.log ( "Chargement des utilisateurs depuis la base de données ... "); const étudiants = attendre connection.manager.find (Student); console.log ( "Utilisateurs chargés: ", étudiants); findOne Similaire à la méthode find , mais renvoie le premier enregistrement correspondant. L"exemple de code est le suivant - const stud = await manager.findOne (Student, 1); clear La méthode clear efface toutes les données de la table. L"exemple de code est le suivant - await manager.clear (Student); TypeORM - Générateur de requêtes Le générateur de requêtes est utilisé pour créer facilement des requêtes SQL complexes. Il est initialisé à partir de la méthode Connection et des objets QueryRunner. Nous pouvons créer QueryBuilder de trois manières. Connection Prenons un exemple simple d"utilisation de QueryBuilder en utilisant méthode de connexion. import {getConnection} from "typeorm const user = wait getConnection () .createQueryBuilder () .select ( "user ") .from (User, "user ") .where ( "user.id =: id ", {id: 1} ) .prends en un(); Gestionnaire d"entités Créons un générateur de requêtes à l"aide du gestionnaire d"entités comme suit - import {getManager} depuis "typeorm const user = wait getManager () .createQueryBuilder (User, "user ") .where ( "user.id =: id ", {id: 1}) .getOne (); Repository Nous pouvons utiliser le dépôt pour créer un générateur de requêtes. Il est décrit ci-dessous, import {getRepository} from "typeorm const user = wait getRepository (User) .createQueryBuilder ( "user ") .where ( "user.id =: id ", {id: 1}) .getOne (); Alias Les alias sont les mêmes que les alias SQL. Nous créons un alias pour la table Student en utilisant QueryBuilder comme décrit ci-dessous - import {getConnection} from "typeorm const user = wait getConnection () .createQueryBuilder () .select ( "stud ") .from (Student, "stud ") Cette requête équivaut à, sélectionnez * parmi les étudiants comme stud Paramètres Les paramètres sont utilisés comme espaces réservés pour le valeurs dynamiques dans la requête. Dans de nombreux cas, la requête pour trouver un objet entité différent sera la même à l"exception des valeurs. Par exemple, la requête pour trouver un étudiant différent est la même, à l"exception des données Student ID . Dans ce cas, nous pouvons utiliser le paramètre pour Student ID puis changer le paramètre pour obtenir les différents objets étudiant. Une autre utilisation importante du paramètre est d"empêcher l"injection SQL. C"est l"une des failles de sécurité les plus importantes de l"application Web moderne. En utilisant le paramètre dans la requête, nous pouvons survivre aux attaques par injection SQL. Une autre utilisation importante du paramètre est d"empêcher l"injection SQL. C"est l"une des failles de sécurité les plus importantes de l"application Web moderne. En utilisant le paramètre dans la requête, nous pouvons survivre aux attaques par injection SQL. Par exemple "student.id =: id ", {id: 1} Here, : id - nom du paramètre. {id: 1} - valeur du paramètre Ajouter une expression Cette section explique comment utiliser les expressions. où où est utilisé pour filtrer les enregistrements si le condition correspondante. createQueryBuilder ( "student ") .where ( "student.id =: id ", {id: 1}) Cette requête équivaut à, select * from Students student où student.id = 1; Nous pouvons également utiliser les conditions AND, OR, NOT, IN à l"intérieur. ayant L"expression simple ayant une expression est définie ci-dessous - class = "result notranslate "> createQueryBuilder ( "étudiant ") .having ( "student.id =: id ", {id: 1}) Cette requête équivaut à, sélectionnez * parmi les étudiants étudiant ayant student.id = 1; orderBy orderby est utilisé pour trier les enregistrements en fonction du champ. createQueryBuilder ( "étudiant ") .orderBy ( "student.name ") Cette requête équivaut à, select * from Students stu ordre de dent par student.name; groupBy Il est utilisé pour regrouper les enregistrements en fonction de la colonne spécifiée. createQueryBuilder ( "student " ) .groupBy ( "student.id ") Cette requête équivaut à, select * from student group by student.id ; limit Il est utilisé pour limiter la sélection de lignes. Ci-dessous, un exemple montre comment utiliser la limite dans le générateur de requêtes, createQueryBuilder ( "student ") .limit (5) Cette requête est équivalent à, sélectionnez * à partir de la limite des étudiants étudiants 5; offset Offset est utilisé pour spécifier le nombre de lignes pour ignorer le résultat. Il est défini ci-dessous - createQueryBuilder ( "student ") .offset (5) Cette requête est équivalente à, sélectionnez * à partir de l"offset des étudiants étudiants 5; joins clause de jointure est utilisée pour combiner des lignes de deux ou plusieurs tables, en fonction d"une colonne associée. Considérez les deux entités - Student.ts import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm import {Projet} de "./ Projet Classe d"exportation @Entity () User {@PrimaryGeneratedColumn () id: number; @Column () nom: chaîne; @OneToMany (type => Project, project => project.student) projets: projet ; } Project.ts import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm import {Student} from "./ Student Classe d"exportation @Entity () Project {@PrimaryGeneratedColumn () id: number; @Column () titre: chaîne; @ManyToOne (type => Student, student => student.projects) étudiant: Student; } Faisons une simple jointure à gauche en utilisant la requête ci-dessous - const student = wait createQueryBuilder ( "student ") .leftJoinAndSelect ( "Student.projects ", " project ") .where (" student.name =: name ", {name: " Student1 "}) .getOne (); Cette requête équivaut à, SELECT étudiant. *, projet. * FROM étudiants étudiant GAUCHE REJOINDRE projets project ON project.student = student.id WHERE student.name = "Student1 " De même, nous pouvons également essayer la jointure interne. Rejoindre sans sélection Nous pouvons joindre des données sans utiliser select. Essayons cet exemple en utilisant la jointure interne comme suit - const student = await createQueryBuilder ( "student ") .innerJoin ( "student.projects ", "project ") .where ( " student.name =: name ", {name: " student1 "}) .getOne (); La requête ci-dessus équivaut à - SELECT étudiant. * FROM étudiants étudiant INNER JOIN projects project ON project.student = student.id WHERE student.name = "Student1 "; Pagination Si vous avoir plus de données dans votre application, vous avez besoin pagination, curseur de page ou fonctionnalités de défilement. Par exemple, si vous souhaitez afficher les cinq premiers projets d"étudiants dans votre application, const étudiants = attend getRepository (Student) .createQueryBuilder ( "étudiant ") .leftJoinAndSelect ( "student.projects ", "project ") .take (5) .getMany (); sous-requêtes Elle est appelée requête dans une autre requête ou requête imbriquée. Nous utilisons des sous-requêtes dans les expressions FROM, WHERE et JOIN. Un exemple simple est présenté ci-dessous - const projects = await connection .createQueryBuilder () .select ( "project.id ", "id ") .addSelect (subQuery => {return subQuery .select ( "student.name ", "name ") .from (Student, "student ") .limit (1);}, " nom ") .from (Projet, " projet ") .getMany (); Champ masqué Si l"un des champs de votre colonne est marqué comme {select: false}, alors cette colonne est considérée comme une colonne masquée. Considérez l"entité ci-dessous - import {Entity, PrimaryGeneratedColumn, Column} from " typeorm @Entity () export class Student {@PrimaryGeneratedColumn () id: number; @Column () name: string; @Column ({select: false}) adresse: chaîne;} Here, Le champ adresse est marqué comme masqué . Nous pouvons utiliser addSelect pour récupérer les informations de la colonne. Elle est définie ci-dessous, const student = await connection.getRepository (Student) .createQueryBuilder (). select ( "student.id ", "student ") .addSelect ( "student.address ") .getMany (); getSql() Ceci est utilisée pour obtenir la requête SQL générée par le générateur de requêtes. Elle est définie ci-dessous - const sql = createQueryBuilder ( "student ") .where ( "student .name =: nom ", {nom: " Student1 "}) .orWhere (" student.age =: age ", {age: 14}) .getSql (); TypeORM - Opérations de requête La manipulation des données est utilisée pour m anage et afficher les données. Cette section explique comment accéder aux requêtes de base de données telles que les requêtes d"insertion, de mise à jour, de sélection et de suppression à l"aide de QueryBuilder. Passons en revue un par un en détail. Créer une requête d"insertion Créons une entité Client comme suit - Client .ts import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Classe d"exportation @Entity () Client {@PrimaryGeneratedColumn () id: number; @Column () nom: chaîne; @Column () age: nombre; } Ajoutons les changements suivants dans index.ts comme suit - index.ts import "refléter- métadonnées import {createConnection} de "typeorm import {Client} de "./ entité / Client import {getConnection} de "typeorm createConnection (). then ( connection => {attend getConnection (). createQueryBuilder () .insert () .into (Customer) .values ​​([{name: "Adam ", age: 11}, {name: "David ", âge: 12}]) .execute (); }). catch (erreur => console.log (erreur)); Maintenant, démarrez votre application en utilisant la commande ci-dessous - npm start Output Vous pourrait voir la sortie suivante sur votre écran - Maintenant, ouvrez votre serveur mysql, table insérée avec deux champs comme indiqué ci-dessous - Créer une requête de mise à jour Dernière section, nous avons inséré deux lignes de données. Voyons comment fonctionne la requête de mise à jour. Ajoutez les modifications suivantes dans index.ts comme suit - import "reflect-span data import {createConnection} de "typeorm import {Client} de "./ entité / Client import {getConnection} de "typeorm createConnection (). then ( connection => {attend getConnection () .createQueryBuilder () .update (Customer) .set ({name: "Michael "}) .where ( "id =: id ", { id: 1}) .execute (); console.log ( "données mises à jour ");}). catch (erreur => console.log (erreur)); Maintenant, démarrez votre application en utilisant la commande ci-dessous - npm start Vous pouvez voir la sortie suivante sur votre écran - La table Mysql est modifiée comme indiqué ci-dessous - La requête Build Select select est utilisée pour afficher les enregistrements de la table. Ajoutons le code suivant dans index.ts comme suit - index.ts import "reflect-span data import {createConnection} de "typeorm import {Client} de "./ entité / Client createConnection (). puis ( connection => {console.log ( "Afficher les enregistrements de la table Client ... "); const cus = nouveau client (); console.log ( "Chargement des clients depuis la base de données ... "); clients const = attendre connection.manager.find (Client); console.log ( "Utilisateurs chargés: ", clients); }). catch (erreur => console.log (erreur)); Vous pouvez voir la sortie suivante sur votre écran - expression where Ajoutons l"expression where dans la requête pour filtrer les clients. L"exemple de code est le suivant - import "reflect-span data import {createConnection} de "typeorm import {Client} de "./ entité / Client import {getConnection} de "typeorm createConnection (). then ( connection => {const customer = wait getConnection () .createQueryBuilder () .select ( "cus ") .from (Customer, "cus ") .where ( "cus.id =: id ", {id: 1}) .getOne (); console.log (client);}) .catch (erreur => console.log (erreur)); Le programme ci-dessus retournera les premiers enregistrements d"identifiant. Vous pouvez voir la sortie suivante sur votre écran, De même, vous pouvez également essayer d"autres expressions. Créer une requête de suppression Dernière section, nous avons inséré, mis à jour et sélectionné Les données. Voyons comment fonctionne la requête de suppression. Ajoutez les modifications suivantes dans index.ts comme suit - import "reflect-span data import {createConnection} de "typeorm import {Client} de "./ entité / Client import {getConnection} de "typeorm createConnection (). then ( connection => {attend getConnection () .createQueryBuilder () .delete () .from (Client) .where ( "id =: id ", {id: 1}) .execute () ; console.log ( "données supprimées ");}). catch (erreur => console.log (erreur)); Vous pouviez voir le f suite à la sortie sur votre écran - Et votre table mysql est modifiée comme suit - TypeORM - Transactions En général, la transaction est une unité logique responsable de l"exécution de la récupération et des mises à jour des données. Cette section explique en détail les transactions. Création de transactions Nous pouvons créer une transaction en utilisant soit connection, soit EntityManage. L"exemple ci-dessous est utilisé pour spécifier créer une connexion et enregistrer les données à l"intérieur. import {getConnection} from "typeorm attendre getConnection (). transaction ( transactionalEntityManager => {attendre connection.manager.save (étudiants);}); EntityManager est illustré ci-dessous - import {getManager} from "typeorm attendre getManager (). transaction ( transactionalEntityManager => {attendre transactionalEntityManager.save (étudiants);}); Decorators Nous avons trois types de décorateurs liés aux transactions dans TypeORM. @Transaction - Enveloppe toute l"exécution dans une seule transcation de base de données. @TransactionManager - Utilisé pour exécuter des requêtes à l"intérieur de la transaction. Il est défini ci-dessous, @Transaction ({isolation: "SERIALIZABLE "}) save (@TransactionManager () manager: EntityManager, étudiant: Student ) {return manager.save (étudiant); } Here, Nous avons utilisé le niveau d"isolement SERIALIZABLE pour la transaction. @TransactionRepository - Utilisé pour injecter la transaction dans le référentiel. Il est défini ci-dessous, @Transaction () save (student: Student, @TransactionRepository (Student) studentRepository: Re pository ) {return studentRepository.save (étudiant); } Transaction dans QueryRunner QueryRunner est utilisé pour exécuter toutes les requêtes de base de données. Il a une seule connexion à la base de données. La transaction de base de données peut être organisée à l"aide de QueryRunner . Exécutons une seule transaction à l"aide de QueryRunner . import {getConnection} from "typeorm // obtenir une connexion et créer un nouveau lanceur de requête const connection = getConnection (); const queryRunner = connection.createQueryRunner (); // Etablit une véritable connexion à la base de données en utilisant notre nouveau lanceur de requêtes wait queryRunner.connect (); // maintenant, nous pouvons exécuter toutes les requêtes sur un exécuteur de requêtes, par exemple: wait queryRunner.query ( "SELECT * FROM étudiants "); Maintenant, lancez la transaction en utilisant l"instruction ci-dessous - wait queryRunner.startTransaction (); Ensuite, validez et annulez la transaction en utilisant l"instruction ci-dessous, try {await queryRunner.commitTransaction (); } S"il y a une erreur, elle est gérée par catch (), catch (err) {// puisque nous avons des erreurs permet de revenir en arrière les modifications que nous avons apportées attendent queryRunner.rollbackTransaction (); } Maintenant, libérez le queryRunner comme ci-dessous - enfin {// vous devez libérer le lanceur de requête qui est créé manuellement: wait queryRunner.release (); } TypeORM - Indices En général, l " Indexation est un processus permettant d"optimiser les performances d"une base de données en optimisant le stockage des données. Il permet de localiser et d"accéder rapidement aux données d"une base de données. Cette section explique comment utiliser l"index dans TypeORM. Les indices sont classés en différents types. Passons en revue un par un en détail. Indices de colonne Nous pouvons créer un index pour une colonne particulière en utilisant @Index . Prenons un exemple d"entité Client comme indiqué ci-dessous et d"index défini pour en premier Nom colonne, import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Classe d"exportation @Entity () Étudiant {@PrimaryGeneratedColumn () id: number; @Index () @Column () firstName: chaîne; @Column () lastName: chaîne; @Column () age: nombre; @Column () adresse: chaîne; } @Index permet également de spécifier le nom d"un index - @Index ( "Name-idx ") @Column () firstName: chaîne; Indices uniques Pour spécifier des contraintes uniques dans votre colonne, utilisez la propriété ci-dessous - {unique: true} Par exemple, ci-dessous est le code pour spécifier un index unique pour la colonne Nom - @Index ({unique: true }) @Column () firstName: chaîne; Pour appliquer des indices à plusieurs colonnes, nous pouvons le spécifier directement après @Entity (). L"exemple de code est le suivant - @Entity () @Index ([ "firstName ", "lastName "]) @Index ([ "firstName ", " lastName "], {unique: true}) Indices spatiaux L"index spatial permet d"accéder aux objets spatiaux. MySQL et PostgreSQL prennent en charge les indices spatiaux. Pour activer les indices spatiaux dans votre colonne, ajoutez la propriété suivante - {spatial: true} Le type spatial a plusieurs sous-types tels que la géométrie , point, chaîne de ligne, polygone etc., par exemple, si vous voulez ajouter un type spatial de point dans votre colonne, utilisez le code ci-dessous - @Column ( "point ") @Index ({spatial: true}) point: chaîne; Désactiver la synchronisation Pour désactiver la synchronisation, utilisez l"option ci-dessous sur @Index décorateur - {synchronize: false} TypeORM - Entity Listener and Logging Entity listener est utilisé dans les entités qui prennent en charge la méthode personnalisée et écoutent des événements spécifiques. Nous pouvons définir n"importe quelle méthode personnalisée d"entité à l"aide de décorateurs. Laisser" s comprennent les décorateurs en bref. @AfterLoad - Lorsque l"entité est chargée à l"aide de QueryBuilder ou du référentiel / gestionnaire, cette méthode sera appelée . @BeforeInsert - Cette méthode sera appelée avant l"insertion de l"entité à l"aide du référentiel / gestionnaire. @AfterInsert - Ce La méthode sera appelée après l"insertion de l"entité à l"aide du référentiel / gestionnaire. @BeforeUpdate - Cette méthode l"appellera avant qu"une entité existante ne soit mise à jour à l"aide du référentiel / gestionnaire. @AfterUpdate - Il sera appelé après la mise à jour d"une entité. @BeforeRemove - Il sera appelé avant qu"une entité soit supprimée. @AfterRemove - Il sera appelé après la suppression d"une entité. Abonné L"abonné est utilisé pour écouter une entité spécifique événements. Il est implémenté à partir de EntitySubscriberInterface . Voyons un exemple simple d’utilisation de l’écouteur d’entité dans l’abonné. Considérez que l"entité Student est affichée ci-dessous - Student.ts import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Classe d"exportation @Entity () Étudiant {@PrimaryGeneratedColumn () id: number; @Column () Nom: chaîne; @Column () age: nombre; } Créer un abonné étudiant L"abonné est créé à l"aide de la commande ci-dessous - typeorm abonné: create -n StudentSubscriber La commande ci-dessus crée un répertoire d"abonnés dans votre projet src.Ensuite,lefichierStudentSubscriber.tsestcréédansvotreabonné.Vouspouvezvoirlaréponsesuivante, Subscriber /Users/workspace/TypeORM/FirstProject/src/subscriber/StudentSubscriber.tsaétécrééavecsuccès.Maintenant,passezaufichier,vouspouvezvoirlecodageci-dessous-StudentSubscriber.ts import {EventSubscriber, EntitySubscriberInterface} de "typeorm Classe d"exportation @EventSubscriber () StudentSubscr iber implémente EntitySubscriberInterface {} Maintenant, ajoutez les modifications suivantes dans le fichier, import {EventSubscriber, EntitySubscriberInterface, InsertEvent} depuis "typeorm import {étudiant} de "../ entité / étudiant La class d"exportation @EventSubscriber () StudentSubscriber implémente EntitySubscriberInterface {listenTo () {return Student; } afterInsert (événement: InsertEvent ) {console.log (événement); }} Here, Nous avons utilisé la méthode afterInsert () pour appeler l"événement d"entité. De même, vous pouvez également utiliser d"autres événements. Nous avons déjà configuré le fichier ormconfig.json. Maintenant, ajoutez les modifications ci-dessous dans le fichier index.ts comme suit - index.ts import "reflète -métadonnées import {createConnection} de "typeorm import {Student} from "./ entity / Student createConnection (). then (connexion hrone => {console.log ( "connexion établie ");}). catch (erreur => console.log (erreur)); Après avoir exécuté l"application, vous pouvez voir la sortie ci-dessous sur votre écran, Journalisation La journalisation de la base de données est une partie importante de la conception de votre solution de base de données hautement disponible car les journaux de base de données le permettent pour récupérer après un échec, et ils permettent de synchroniser les bases de données primaires et secondaires. Toutes les bases de données ont des journaux qui leur sont associés. Ces journaux conservent des enregistrements des modifications de la base de données. Si une base de données doit être restaurée à un point au-delà de la dernière sauvegarde complète hors ligne, des journaux sont nécessaires pour transférer les données jusqu"au point de défaillance. Options de journalisation La journalisation est activée en ajoutant {logging: true} dans la connexion à la base de données. Les options de journalisation sont classées en différents types. Ils sont les suivants - requête - renvoie toutes les requêtes de journal. Il est défini comme indiqué ci-dessous - {host: " localhost ", ... logging: [" query "]} error - renvoie les journaux de toutes les requêtes et erreurs ayant échoué . Il est défini ci-dessous - {host: "localhost ", ... logging: [ "error "]} schema - renvoie les journaux du schéma. warn - renvoie des avertissements ORM internes. info - renvoie les messages informatifs ORM internes. log - renvoie les messages internes du journal ORM. Logger personnalisé La journalisation personnalisée est option de journalisation simple et hautement personnalisable. Nous pouvons créer notre propre class de journalisation en utilisant le code ci-dessous - import {Logger} from "typeorm export class MyCustomLogger implements Logger {// implémenter toutes les méthodes de la class logger} L"option de connexion est spécifiée dans ormconfig.json comme suit - name: "mysql " , tapez: "mysql ", hôte: "localhost ", port: 3306, nom d"utilisateur: "root ", mot de passe: "root ", dat abase: "test ", logger: new MyCustomLogger () TypeORM avec JavaScript Le langage par défaut pris en charge par TypeORM est TypeScript . Étant donné que TypeScript prend en charge le typage statique, les classs et les décorateurs, il est facile de définir l"entité et ses attributs. Dans le même temps, JavaScript est également nécessaire dans certains projets où le langage préféré est JavaScript. TypeORM fournit également une prise en charge complète du langage JavaScript. TypeORM prend en charge les versions es5 et es6 de JavaScript. Dans ce chapitre, apprenons à écrire l"application TypeORM dans JavaScript ES5 (ECMAScript 5). Ouvrez une invite de commande et allez à votre espace de travail. cd / path / to / workspace / Exécutez la commande ci-dessous pour créer un projet TypeORM. typeorm init --name typeorm-java-student-app --database mysql Ouvrez le fichier package.json pour supprimer les références typescipt. origine al { "name ": "typeorm-java-student-app ", "version ": "0.0.1 ", "deion ": "Projet génial développé avec TypeORM. ", "devDependencies ": { "ts-node ": "3.3.0 ", "@ types / node ": " ^ 8.0.29 ", " type ": " 3.3.3333 "}, " dependencies ": {" typeorm ": " 0.2.24 ", " Reflect-span data " : "^ 0.1.10 ", "mysql ": "^ 2.14.1 "}, "s ": { "start ": "ts-node src/index.ts"}}misàjour {" name ": " typeorm-java-student-app ", " version " : "0.0.1 ", "deion ": "Projet génial développé avec TypeORM. ", "Dépendances ": { "typeorm ": "0.2.24 ", "mysql ": " ^ 2.14.1 "}, " s ": {" start ": " node src/index.js"}}Ici, Suppression de la section devDependencies et du package associé au typScript dans la section dépendances . Changement du début pour pointer du code java au lieu du code dactylographié . Exécutez la commande ci-dessous pour installer les packages nécessaires. npm install Supprimer tsconfig. json et le fichier index.ts. Supprimez le fichier User.ts dans le dossier de l"entité, puis créez une entité étudiant au format json, student.json comme spécifié ci-dessous - { "name ": "Student ", "columns ": { "id ": { "primary ": true, "type ": "int ", "generated ": true}, "name ": { "type ": "varchar "}, "age ": { "type ": " integer "}}} Créez un nouveau fichier, src/index.jsetmettezlecodeci-dessous- var typeorm = require ( "typeorm "); var EntitySchema = typeorm.EntitySchema; typeorm.createConnection ({ "type ": "mysql ", "host ": "localhost ", "port ": 3306, "username ": "root ", "password ": "123456 ", "database ": "typeorm_test_db ", "synchronize ": true, "logging ": false, entity: [new EntitySchema (require ( ". /entity/student.json ") )]}) .then (function (connection) {return connection.getRepository ( "Student ");}) .then (function (studentRepository) {var student = {name: "Student1 ", age: 18} ; return studentRepository.save (student) .then (function (savedStudent) {console.log ( "L"élève a bien été enregistré: ", savedStudent); return studentRepository.find ();}) .then (function (étudiants) {console.log ( "Tous les étudiants: ", étudiants); return;}) .catch (fonction (erreur) {console.log ( "Erreur: ", erreur); return;})}) .catch (fonction (erreur) {console.log ( "Erreur: ", erreur) return;}); Ici , Nous avons utilisé les mêmes méthodes typeORM à l"exception des modifications mentionnées ci-dessous, Utilisé EntitySchema pour configurer l"entité étudiante. Utilisation des blocs du concept JavaScript Promise (then / catch / finally). Maintenant, exécutez l"application en utilisant la commande ci-dessous - npm start L"application insère les informations sur les étudiants dans la base de données, puis récupère tous les étudiants de la base de données et les affiche dans la console comme indiqué ci-dessous - > typeorm-java-student-app@0.0.1 start / path / to / workspace / typeorm-java-student-p> node src/index.jsL"élèveaétéenregistréavecsuccès:{name:"Student1",age:18,id:1}Touslesétudiants:[{id:1,name:"Student1",age:18}]TypeORM-TravailleravecMongoDBCechapitreexpliquelapriseenchargeétenduedelabasededonnéesMongoDBfournieparTypeORM.Espéronsquenousavonsinstallémongodbenutilisantnpm.S"iln"estpasinstallé,utilisezlacommandeci-dessouspourinstallerlepiloteMongoDB, npm install mongodb --save Création d"un projet Créons un nouveau projet en utilisant MongoDB comme suit - typeorm init --name MyProject --database mongodb Configurez ormconfig.json Configurons les options d"hôte, de port et de base de données MongoDB dans le fichier ormconfig.json comme spéci ci-dessous - ormconfig.json { "type ": "mongodb ", "host ": "localhost ", " port ": 27017, " base de données ": " test ", " synchronize ": true, " logging ": false, " entités ": [" src/entité/**/*.ts"],"migrations":[" src/migration/**/*.ts"],"abonnés":[" src/abonné/**/*.ts"],"cli":{"entityDir":" src/entity","migrationsDir":" src/migration","subionDir":" src/subion"}}DéfinissezdesentitésetdescolonnesCréonsunenouvelleentiténomméeStudentdansvotrerépertoiresrc.Lesentitésetlescolonnessontidentiques.Pourgénérerunecolonnedecléprimaire,nousutilisons@PrimaryColumnou@PrimaryGeneratedColumn.Celapeutêtredéfinicomme@ObjectIdColumn.Unexemplesimpleestmontréci-dessous-Student.ts import {Entity, ObjectID, ObjectIdColumn, Column} from "typeorm Classe d"exportation @Entity () Etudiant {@ObjectIdColumn () id: ObjectID; @Column () Nom: chaîne; @Column () Pays: chaîne; } Pour enregistrer cette entité, ouvrez le fichier index.ts et ajoutez les modifications suivantes - index.ts import "refléter les métadonnées import {createConnection} de "typeorm import {Student} from "./ entity / Student createConnection (). then ( connection => {console.log ( "Insertion d"un nouvel étudiant dans la base de données ... "); const std = new Student (); std.Name = "Student1 std .Country = "Inde await connection.manager.save (std); console.log ( "A enregistré un nouvel utilisateur avec l"ID: " + std.id); console.log ( "Chargement des utilisateurs depuis le database ... "); const stds = wait connection.manager.find (Student); console.log (" Utilisateurs chargés: ", stds); console.log (" TypeORM with MongoDB ");} ) .catch (erreur => console.log (erreur)); Maintenant, démarrez votre serveur et vous obtiendrez la réponse suivante - npm start MongoDB EntityManager Nous pouvons également utiliser EntityManager pour récupérer des données. Exemple simple est montré ci-dessous - import {getManager} from "typeorm const manager = getManager (); const result = await manager.findOne (Student, {id: 1}); De même, nous pouvons également utiliser le référentiel pour accéder aux données. import {getMongoRepository} depuis "typeorm const studentRepository = getMongoRepository (Student); const result = await studentRepository.findOne ({id: 1}); Si vous voulez filtrer les données en utilisant l"option égale comme suit - import {getMongoRepository} from "typeorm const studentRepository = getMongoRepository (Student); const result = wait studentRepository.find ({where: {Name: {$ eq: "Student1 "}, }}); Comme nous l"avons vu dans ce chapitre, TypeORM facilite l"utilisation du moteur de base de données MongoDB. TypeORM w ith Express Express est l"un des frameworks JavaScript populaires pour créer une application Web. Apprenons à utiliser TypeORM avec le framework express dans ce chapitre. Créer une application simple TypeORM La CLI fournit une option simple pour créer une application Web express fonctionnelle complète (application API Restful) intégrée à TypeORM . La commande CLI pour créer l"application est la suivante - cd / path / to / workspace typeorm init --express --name typeorm-express-sample --database mysql La commande ci-dessus créera une nouvelle application Web dans le dossier typeorm-express-sample. La structure de l"application est la suivante - │ .gitignore │ ormconfig.json │ package.json │ README.md │ tsconfig.json │ └───src│index.ts│routes.ts│├───controller│UserController.ts│├───entity│User.ts│└───migrationHere,Commenoussavons,ormconfig.jsonestlefichierdeconfigurationTypeORM.Lecodeestlesuivant, { "type ": "mysql ", "host ": "localhost ", "port ": 3306, " nom d"utilisateur ": " test ", " mot de passe ": " test ", " base de données ": " test ", " synchronize ": true, " journalisation ": false, " entités ": [" src/entity/**/*.ts"],"migrations":[" src/migration/**/*.ts"],"abonnés":[" src/abonné/**/*.ts"],"cli":{"entityDir":" src/entity","migrationsDir":" src/migration","subscribersDir":" src/subion"}}Ici,modifiezleparamètredebasededonnéespourqu"ilcorrespondeàceluidevotrebasededonnéeslocale.package.jsonestlaconfigurationprincipaledel"application.Lefichiertsconfig.jsoncontientlaconfigurationrelativeàTypeScript.LedossierentitycontientlesmodèlesTypeORM.UnmodèleUserpardéfautseracrééparCLIetilseprésentecommesuit- import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Classe d"exportation @Entity () User {@PrimaryGeneratedColumn () id: number; @Column () firstName: chaîne; @Column () lastName: chaîne; @Column () age: nombre; Le dossier} controller contient les contrôleurs express. La CLI crée un contrôleur d"API utilisateur par défaut avec ajouter / répertorier / supprimer les détails de l"utilisateur. Le code est le suivant - import {getRepository} from "typeorm import {NextFunction, Request, Response} de "express import {User} from "../ entity / User class d"exportation UserController {private userRepository = getRepository (User); hroniser tous (requête: requête, réponse: réponse, suivant: fonction suivante) {return this.userRepository.find (); } one (requête: requête, réponse: réponse, suivant: NextFunction) {return this.userRepository.findOne (request.params.id); } save (request: Request, response: Response, next: NextFunction) {return this.userRepository.save (request.body); } remove (demande : Demande, réponse: Réponse, suivant: NextFunction) {laissez userToRemove = attendre this.userRepository.findOne (request.params.id); attendez this.userRepository.remove (userToRemove); }} Here, all méthode est utilisée pour récupérer tous les utilisateurs de la base de données. un est utilisée pour récupérer un seul utilisateur de la base de données en utilisant la méthode user id save est utilisée pour enregistrer les informations de l"utilisateur dans la base de données. La méthode delete est utilisée pour supprimer l"utilisateur de la base de données en utilisant user id routes.ts mappe les méthodes du contrôleur utilisateur à l"URL appropriée et le code est le suivant - import {UserController} from "./ controller / UserController export const Routes = [{method: "get ", route: "/ users ", controller: UserController, action: "all "}, {method: "get ", route: "/ users /: id ", controller: UserController, action: " one "}, {method: " post ", route: " / users ", controller: UserController, action: " save "} , {méthode: "delete ", route: "/ users /: id ", contrôleur: UserController, action: "remove "}]; Here, / L"URL des utilisateurs est mappée au contrôleur utilisateur. Chaque verbe post, get et delete sont mappés à des méthodes différentes. Enfin, index.ts est notre principal point d"entrée d"application Web. Le code source est le suivant - import "reflect-span data import {createConnection} de "typeorm importer * comme express de "express import * comme bodyParser depuis "body-parser import {Request, Response} from "express import {Routes} de "./ routes import {User} from "./ entity / User createConnection (). then ( connection => {// create express app const app = express (); app.use (bodyParser.json ()); // enregistre les routes express à partir des routes d"application définies Routes.forEach (route => {(app as any) [route.method] (route.route, (req: Request, res: Response, next: Function) => {const result = (new (route.controlle r comme n"importe quel)) [route.action] (req, res, next); if (instance de résultat de Promise) {result.then (result => result! == null && result! == undefined? res.send (result): undefined); } else if (result! == null && result! == undefined) {.json (result); }}); }); // configurer l"application express ici // ... // démarrer le serveur express app.listen (3000); // insérer de nouveaux utilisateurs pour le test en attente de connection.manager.save (connection.manager.create (User, {firstName: "Timber ", lastName: "Saw ", age: 27})); attendre connection.manager.save (connection.manager.create (User, {firstName: "Phantom ", lastName: "Assassin ", age: 24})); console.log ( "Le serveur Express a démarré sur le port 3000. Ouvrez http://localhost:"" 3000 / users pour voir les résultats "); }). catch (erreur => console.log (erreur)); Ici, l"application configure les routes, insère deux utilisateurs puis lance l"application web sur le port 3000 . Nous pouvons accéder à l"application à http://localhost:""3000 Pour exécuter l"application, suivez les étapes ci-dessous - Installons les packages nécessaires en utilisant commande ci-dessous - npm install Sortie npm a créé un fichier de verrouillage en tant que package -lock.json. Vous devez valider ce fichier. npm WARN typeorm-express-sample@0.0.1 Aucun champ de référentiel. npm WARN typeorm-express-sample@0.0.1 Aucun champ de licence. ajouté 176 packages de 472 contributeurs et audité 351 packages dans 11.965s 3 packages recherchent des financements exécutez `npm fund` pour les détails trouvés 0 vulnérabilités Exécutez la commande ci-dessous pour démarrer l"application. npm start Sortie > typeorm-express-sample@0.0.1 start / path / to / workspace / typeorm-express-p> ts-node src/index.tsLeserveurExpressadémarrésurleport3000.Ouvrezhttp://localhost:""3000/userspourvoirlesrésultatsAccédonsànotresiteWebAPId"applicationutilisantlacommandecurlcommeci-dessous- curl htt p: // localhost: 3000 / users Here, curl est une application en ligne de commande pour accéder à une application Web à partir d"une invite de commande. Il prend en charge tous les verbes HTTP tels que get, post, delete, etc., Output [{ "id ": 1, "firstName ": "Timber ", "lastName ": "Saw ", "age ": 27}, { "id ": 2, "firstName ": " Phantom ", " lastName ": " Assassin ", " age ": 24}] Pour récupérer le premier enregistrement, nous pouvons utiliser la commande ci-dessous - curl http://localhost:"" 3000 / users / 1 Sortie { "id " : 1, "firstName ": "Timber ", "lastName ": "Saw ", "age ": 27} Pour supprimer un enregistrement d"utilisateur, nous pouvons utilisez la commande ci-dessous - curl -X DELETE http://localhost:"" 3000 / users / 1 Comme nous l"avons vu dans ce chapitre, TypeORM peut être facilement intégré dans une application express. TypeORM - Migrations Les migrations sont comme le contrôle de version de votre base de données. Il est utilisé pour modifier et partager le schéma de base de données de l"application. Cette section explique comment les migrations fonctionnent dans TypeORM. Créer une nouvelle migration Pour créer une nouvelle migration, nous devons d"abord configurer la connexion dans ormconfig.json. Il est défini ci-dessous - ormconfig.json "type ": "mysql ", "host ": " localhost ", " port ": 8889, " username ": " root ", " password ": " root ", " database ": " Library ", " entités ": [" entité / *. js "], " migrationsTableName ": " student_migration_table ", " migrations ": [" migration / *. js "], " cli ": {" migrationsDir ": " migration "} Ici, migrationsTableName - il fait référence au nom de la table de migration. migrations - TypeORM charge les migrations à partir du répertoire donné. cli - indique que la migration va créer dans le répertoire spécifique. Créer une entité Book Créons une entité nommée Book entité dans sr c / entity / Book.ts comme suit - import {Entity, Column, PrimaryGeneratedColumn} from "typeorm "; Classe d"exportation @Entity () Book {@PrimaryGeneratedColumn () id: number; @Column () titre: chaîne; @Column () texte: chaîne; } Exécutez la CLI pour créer une nouvelle migration Maintenant, nous pouvons exécuter une nouvelle migration en utilisant la CLI comme suit - Syntaxe typeorm migration: create -n Exemple typeorm migration: create -n myMigration Après avoir exécuté la commande ci-dessus, vous pouvez voir la réponse ci-dessous - Migration /path/to/project/src/migration/1587101104904-myMigration.tsaaétégénéréavecsuccès.Maintenant,déplacez-vousdanslefichiersrc/migration/1587101104904-myMigration.tsressembleàceci. import { MigrationInterface, QueryRunner} de "typeorm La class d"exportation myMigration1587101104904 implémente MigrationInterface {public up (queryRunner: QueryRunner): Promise {} public down (queryRunner: QueryRunner): Promise {}} Ici, Nous avons deux méthodes up et down . La méthode up est utilisée pour ajouter des modifications à la migration et la méthode down est utilisée pour annuler les modifications de votre migration. Ajoutons up dans le fichier myMigration.ts comme spécifié ci-dessous - import {MigrationInterface, QueryRunner} from "typeorm la class d"exportation Book1587131893261 implémente MigrationInterface {public up (queryRunner: QueryRunner): Promise {attend queryRunner.query (`ALTER TABLE book ADD COLUMN price int`); } public down (queryRunner: QueryRunner): Promise {}} Here, Nous avons ajouté une nouvelle colonne price à l"intérieur de table de livre . Maintenant, exécutez la CLI pour ajouter les modifications ci-dessus. ts-node ./node_modules/typeorm/cli.js migration: run La commande ci-dessus exécute les migrations et les exécute dans une séquence. Maintenant, vous pouvez voir les changements ci-dessous dans votre écran - Sortie Maintenant, ouvrez votre serveur mysql, une nouvelle colonne est ajoutée. Il est montré ci-dessous - De même, nous pouvons modifier le type de données du titre de colonne en varchar (30) comme suit, import {MigrationInterface, QueryRunner} depuis "typeorm la class d"exportation Book1587131893261 implémente MigrationInterface {public up (queryRunner: QueryRunner): Promise {wait queryRunner.query (`ALTER TABLE book MODIFY COLUMN title varchar (30)`); } public down (queryRunner: QueryRunner): Promise {}} Maintenant, exécutez la même commande et vous pourriez les changements ci-dessous - ts-node ./node_modules/typeorm/cli.js migration: exécutez Sortie Livre est modifiée comme, Revenir à la migration Ajoutons le code ci-dessous dans la méthode down pour annuler la migration - import {MigrationInterface, QueryRunner} from "typeorm la class d"exportation Book1587131893261 implémente MigrationInterface {public up (queryRunner: QueryRunner): Promise {} public down (queryRunner: QueryRunner): Promise {wait queryRunner.query (`ALTER TABLE book drop column price`); // annule les choses faites dans la méthode "up "}} Maintenant, exécutez la commande ci-dessous pour annuler toutes les modifications - ts-node ./node_modules/typeorm/cli.js migration: revert Vous pouvez voir la réponse suivante - Sortie Livre table est modifiée comme, Sortie Comme nous l"avons vu dans ce chapitre, TypeORM facilite l"écriture d"un de migration de base de données. TypeORM - Travailler avec CLI Cette section explique en détail les commandes CLI TypeORM. Créer un projet TypeORM typeorm init est le plus simple et moyen le plus rapide de configurer un projet TypeORM. Vous pouvez créer un nouveau projet en tant que, typeorm init --name Demoproject --database mysql Après l"exécution la commande, vous obtiendrez la sortie suivante sur votre écran - Projet créé dans le répertoire / Users / workspace / TypeORM / Demoproject. Créer une entité Pour créer une nouvelle entité en utilisant CLI comme, typeorm entity: create -n Person Maintenant, l"entité Person est créée dans le répertoire srcdevotreprojet. Entity /Users/workspace/TypeORM/Demoproject/src/entity/Person.tsaaétécrééavecsuccès.Sivousavezunestructuredeprojetmulti-moduleavecplusieursentitésdansdifférentsrépertoires,vouspouvezutiliserlacommandeci-dessous, typeorm entity: create - n Person -d src/Person/entityCréerunnouvelabonnéPourcréerunnouvelabonnéàl"aidedelaCLIcommesuit- typeorm subion: create -n PersonSubscriber Vous pouvez voir la réponse suivante - Subscriber / path / to / TypeORM / Demoproject / src/abonné/PersonSubscriber.tsaétécRéaliséavecsuccès.CréerdesmigrationsVouspouvezcréerunenouvellemigrationàl"aidedelaCLIcommeindiquéci-dessous- typeorm migration: create -n PersonMigration La commande ci-dessus a créé un répertoire de migration dans votre projet src.Lesfichiersdemigrationysontstockés. La migration /path/to/TypeORM/Demoproject/src/migration/1587395030750-PersonMigration.tsaétégénéréeavecsuccès.SchémadebasededonnéesPoursynchroniserunschémadebasededonnées,utilisezlacommandeci-dessous- typeorm schema: sync Pour supprimer complètement un schéma de base de données, utilisez la commande ci-dessous - typeorm schema: drop Requêtes SQL Si vous souhaitez exécuter des requêtes SQL, nous pouvons exécuter directement à partir d"ici. Par exemple, pour afficher tous les enregistrements des clients, utilisez la requête ci-dessous - typeorm query "select * from customers " Si vous voulez effacer tout ce qui est stocké dans le cache. Vous pouvez le faire en utilisant la commande suivante - typeorm cache: clear Conclusion TypeORM est un excellent ORM open source framework pour créer des applications de haute qualité et évolutives, des applications à petite échelle aux applications d"entreprise à grande échelle avec plusieurs bases de données.