Copyright HébergementWebs.com - License GPL

TypeORM - Guía rápida

Tutorial de Typeorm   2020-11-21 17:42:12

TypeORM - Introduccion El marco TypeORM es un marco de Object Relational Mapping (ORM) . Por lo general, la parte Objeto se refiere al dominio / modelo de su aplicacion, la parte Relacional se refiere a la relacion entre tablas en el Sistema de administracion de bases de datos relacionales (por ejemplo, Oracle, MySQL, MS-SQL, PostgreSQL, etc.) y finalmente la parte de Mapeo se refiere al acto de puentear el modelo y nuestras tablas. ORM es un tipo de herramienta que asigna entidades a tablas de bases de datos. ORM proporciona un proceso de desarrollo simplificado mediante la automatizacion de la conversion de objeto a tabla y de tabla a objeto. Una vez que pueda escribir su modelo de datos en un solo lugar, sera mas facil actualizar, mantener y reutilizar el codigo. Dado que la plantilla esta debilmente vinculada al resto de la aplicacion, puede modificarla sin dependencias estrictas conotra parte de la aplicacion y se puede usar facilmente en cualquier lugar de la aplicacion. TypeORM es muy flexible, aleja el sistema DB de la aplicacion y nos permite beneficiarnos del uso del concepto OOPS. Descripcion general TypeORM es una biblioteca Object Relational Mapper que se ejecuta en node .js y esta escrita en TypeScript. TypeScript es una mejora de JavaScript con entrada opcional. TypeScript es un lenguaje compilado. No se interpreta en tiempo de ejecucion. El compilador TypeScript toma archivos TypeScript (.ts) y los compila en archivos JavaScript (.js). TypeORM admite multiples bases de datos como MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana y WebSQL. TypeORM es un ORM facil de usar para crear nuevas aplicaciones que se conectan a bases de datos. La funcionalidad TypeORM es un concepto especifico de RDBMS. Podemos crear rapidamentenuevos proyectos y microservicios. Esta inspirado en una herramienta similar como Hibernate, Doctrine, Entity Framework, etc., otros lenguajes de programacion. Caracteristicas de TypeORM TypeORM viene con las siguientes caracteristicas: Crear automaticamente esquemas de tabla base desde datos basados ​​en sus modelos. Inserte, actualice y elimine facilmente objetos en la base de datos. Cree un mapeo (uno a uno, uno a muchos y -a-muchos) entre las tablas. Proporciona comandos CLI simples. Beneficios de TypeORM TypeORM es un marco ORM facil de usar con codificacion. Tiene las siguientes ventajas: Aplicaciones de alta calidad y poco acopladas. Aplicaciones escalables. Facil integracion con otros modulos. Se adapta perfectamente a cualquier arquitectura, desde pequenas aplicaciones hasta aplicacionesns de negocio. TypeORM - Instalacion Este capitulo explica como instalar TypeORM en su maquina. Antes de continuar con la instalacion, asegurese de que npm este instalado. Para confirmar que tiene npm, puede ejecutar el siguiente comando en su terminal. npm -v Muestra la version. Si no esta instalado, descargue la ultima version e instalela en su maquina. Instale TypeORM Instale TypeORM localmente usando el modulo npm - npm install typeorm --save Despues de ejecutar el comando anterior, obtendra una respuesta como se muestra a continuacion: + [email protected] + agrego 1 paquete y audito 1236 paquetes en 4.729s Alternativamente , para instalar1.er TypeORM globalmente, use el siguiente comando: npm install typeorm -g Despues de eso, instale el paquete opcional reflect-data usando npm - npm install reflect-data --save Puede ver la siguiente respuesta - + a253a38"> agregado 1 paquete y 1236 paquetes auditados en 2.426s Ahora instale otro paquete opcional. tipos de nodos usando el comando siguiente - npm install @ types / node --save Puede ver la siguiente respuesta - + @ types / node @ 12.12.31 agrego 1 paquete y audito 1236 paquetes en 2.167s Instale el controlador de la base de datos En esta seccion, instalemos los paquetes de nodos necesarios para nuestra base de datos. Para instalar el paquete MySQL o MariaDB , utilice el siguiente comando: npm install mysql --save Puede ver la siguiente respuesta - + [email protected] agrego 1 paquete y audito 1236 paquetes en 4.36s Para instalar el paquete PostgreSQL , use el siguiente comando - npm install pg --save Puede ver la respuesta siguiente - + [email protected] agrego 1 paquete y verifico 1236 paquetes en 2.863s Para instalar el paquete SQLite , use el comando ca continuacion - npm install sqlite3 --save Puede ver la siguiente respuesta - + [correo electronico protegido] agregado 48 paquetes de 45 colaboradores y 1396 paquetes verificados en la version 7.31 Para instalar el paquete Microsoft SQL Server , use el siguiente comando: npm install mssql --save Su pantalla se ve asi, + [email protected] agrego 1 paquete y verifico 1655 paquetes en 2.378s Para instalar el paquete sql.js , use el siguiente comando: npm install sql.js --save Puede ver la siguiente respuesta: + sql.js @ 1.2.1 agrego 1 paquete y verifico 1655 paquetes en 6.462s Para instalar el paquete servidor Oracle , use el siguiente comando - npm install oracledb --save Puede ver la siguiente respuesta - + [correo electronico protegido] agrego 1 paquete y audito 1655 paquetes en 2.265s Para instalar el paquete mongodb , use el siguiente comando - npm install mongodb --save Puede ver la siguiente respuesta - + [email protected] agrego 1 paquete y audito 1655 paquetes en 3.716s TypeORM - Crea un proyecto simple Este capitulo explica como crear una aplicacion TypeORM simple. Creemos un nuevo directorio llamado "TypeORM " y vayamos al directorio. cd / path / to / TypeORM / Sintaxis Utilice el siguiente comando para crear un nuevo proyecto: typeorm init --name --database Ejemplo typeorm init --name FirstProject --database mysql Aqui, FirstProject es el nombre de su proyecto y sqlite3 es el nombre de la base de datos. Despues de ejecutar el comando anterior, puede ver la siguiente respuesta, Proyecto creado en el directorio / ruta / a / TypeORM / FirstProject Ahora muevase a nuestro directorio de proyectos e instale las dependencias del proyecto usando el modulo npm , $cd FirstProject $ npm install Estructura del proyecto Comprendamos la estructura del proyecto de nuestro nuevo proyecto, FirstProject . FirstProject ├──> src│├──>entidad││└──>User.ts│├──>migracion│└──>index.ts├──>node_modules├──>ormconfig.json├──>package.json├──>package-lock.json└──>tsconfig.jsonAqui, src-contieneelcodigosourcedesuaplicacionTypeScript.Hayunarchivoindex.tsydossubdirectoriosentidadymigracion.index.ts-Supuntodeentradaalaaplicacion.entidad-Containsdatabasemodels.migracion-containsmigrationdatabasecode.node_modules-modulesnpmodulesregistradoslocalmente.ormconfig.json-Ficherodeconfiguracionprincipaldetuaplicacion.Contienelosdetallesdelaconfiguraciondelabasededatosylaconfiguraciondelasentidades.package.json-Contieneeldepenodemodulendances.package-lock.json-Archivogeneradoautomaticamentevinculadoapackage.json.tsconfig.json-ContainscompileroptionspecifictoTypeScript.fileormconfig.jsonRevisemoslaopciondeconfiguraciondisponibleparanuestraaplicacion.Abraelarchivoformconfig.jsonyseveraasi:"prettyclass="escriba": " mysql ", " host ": " localhost ", " puerto ": 3306, " nombre de usuario ": " prueba ", " contrasena pasar ": " prueba ", " base de datos ": " prueba ", " sincronizar ": verdadero, " registro ": falso, " entidades ": [" src/entity/**/*.ts"ский,"migrations":;" src/migration/**/*.ts"ский,"subscribers":(" src/subscriber/**/*.ts"],"cli":{"entityDir":" src/entity","migrationsDir":" src/migration","subscribersDir":" src/subscriber}}Aqui,tipo,host,nombredeusuario,contrasena,basededatosyopcionesdepuertoestanrelacionadasconlaconfiguraciondelbasededatos.mysqlsepuedeconfigurarusandolasiguienteconfiguracion: { "type ": "mysql ", "host ": "localhost ", " puerto ": 3306, " nombre de usuario ": " db_username ", " contrasena ": " db_password ", " base de datos ": " db_name "} entidades : se refiere a la ubicacion de sus classs de entidad. migraciones : se refiere a la ubicacion de sus classs de migracion. suores : se refiere a la ubicacion de sus classs de suor. cli : se refiere a la opcion utilizada por TypeORM CLI para generar codigo automaticamente Inicie el servidor MySql Antes de iniciar la aplicacion, inicie su servidor MySQL o cualquier servidor de base de datos que este utilizando y asegurese de que este funcionando correctamente . Ejecutar la aplicacion Una vez que todo este configuradoPor ejemplo, podemos ejecutar la aplicacion usando el siguiente comando: npm start Es posible que vea la siguiente respuesta - > start / Users /../../ TypeORM / p> ts-node src/index.tsInsertandounnuevousuarioenlabasededatos...RegistrandounnuevousuarioconID:1Cargandousuariosdelabasededatos...Usuarioscargados:[Usuario{id:1,firstName:"Timber",lastName:"Saw",age:25}]Aquipuedeconfiguraryejecutarexpress/koa/cualquierotromarco.Laaplicacionhacreadounnuevousuarioenlabasededatos,luegolacargaretrocededesdelabasededatosusuariocargadoenlaconsola.HemoscreadoconexitounanuevaaplicacionTypeORM,configuramosyejecutamoslaaplicacion.Discutiremoscomoedontlesdonneessontexecuteesdemanièreelaboreedanslesprochainschapitres.TypeORM-APIdeconnexionPourinteragiraveclabasededonnees,nousavonsbesoind"unobjetdeconnexionàlabasededonnees.Nousdevonscreerunobjetdeconnexionavantdefairel"operationdebasededonneesetymettrefinunefoisquelesoperationsdebasededonneessontterminees.Decouvronsl"APIdeconnexionfournieparTypeORMdanscettesection.Creationd"unenouvelleconnexionAntesdecrearunanuevaconexion,necesitamosconfigurarlosdetallesdelaconexionalabasededatosenormconfigConfigurationfile.json.Acontinuacionsemuestraunamuestradelosdetallesdelaconexion-p>trans.">{nombre:"firstconnection",tipo:"mysql",host:"localhost",puerto:3306,nombredeusuario:"root",contrasena:"root",basededatos:"firstDB"}Aqui, nombre - Nombre de conexion a la base de datos. tipo - Tipoe base de datos. host : nombre de host del servidor de la base de datos. puerto : puerto del servidor de la base de datos. nombre de usuario : nombre de la cuenta con acceso a la base de datos. contrasena : contrasena de la cuenta mencionada anteriormente. base de datos : nombre de la base de datos a conectar. createConnection CreateConnection es proporcionado por TypeORM para crear una nueva conexion. Se define a continuacion, import {createConnection, Connection} from "typeorm connection const = wait createConnection ({}); Aqui, createConnection utilizara los detalles de configuracion especificados en el archivo ormconfig.json. Alternativamente, puede definir la URL de conexion como argumentos del metodo createConnection como se especifica a continuacion: const connection = createConnection ({tipo: "mysql ", url: "localhost: 8888 / firstDB "}) Aqui, createConnection devuelve un objeto, que se puede utilizar para abrir / cerrar la conexion a la base de datos. Varias conexiones TypeORM tambien proporciona una opcion para crear una conexion a multiples bases de datos. Primero, el archivo de configuracion ormconfig.json se puede utilizar para especificar detalles de conexion a multiples bases de datos. Configuremos varias bases de datos en ormconfig.json como se muestra a continuacion, ormconfig.json {nombre: "firstconnection ", escriba: "mysql ", host: "localhost ", puerto: 3306, nombre de usuario: "root ", contrasena: "root ", base de datos datos: "firstDB "}, {nombre: "secondconnection ", tipo: "mysql ", host: "localhost ", puerto: 3306, nombre de usuario: "root ", contrasena: "root ", basedatos: "secondDB "}, {nombre: "tercera conexion ", tipo: "mysql ", host: "localhost ", puerto: 3306, nombre de usuario: "root ", contrasena: " root ", base de datos: " thirdDB "} Ahora podemos usar el argumento proporcionado por el metodo createConnection para especificar el nombre de la conexion para crear el objeto de conexion como se menciona a continuacion - const firstconnection: Connection = esperar createConnection ( "firstconnection "); Aqui, createConnection utilizara los detalles de configuracion de la primera conexion especificada en ormconfig. json para crear el objeto de conexion. TypeORM tambien proporciona otra API, createConnections para crear multiples conexiones a la vez, luego usela cuando sea necesario como se especifica a continuacion - importar {createConnections, Connection} from "typeorm connections const: Connection = await createConnections Aqui, conexiones contienen todos los objetos de conexion como una matriz . ConnectionManager TypeORM tambien proporciona otra API, connectionManager para crear una conexion. Se define a continuacion - importar {getConnectionManager, ConnectionManager, Connection} desde "typeorm const connectionManager = getConnectionManager conexion constante = connectionManager.create ({}); esperar conexion.conectar TypeORM prefiere usar createConnection sobre ConnectionManager para crear objetos de conexion. TypeORM - Entidad Una entidad es una coleccion de campos y operaciones de base de datos asociadas. Se utiliza para mapear la tabla de la base de datos y sus campos con las entidades y sus atributos. Este capitulo explica en detalle las entidadeses TypeORM. Introduccion Creemos una class Entity simple en nuestro codigo. Vaya a la ubicacion raiz de su proyecto, navegue hasta la carpeta srcymuevasealacarpetadelaentidad.AhoracreeunarchivoTypeScript,Student.tseingreseelcodigoacontinuacion:Student.ts import {Entity, PrimaryGeneratedColumn, Column} from " typeorm Export class @Entity () Student {@PrimaryGeneratedColumn () id: number; @Column () Name: string; @Column () age: number ;} Aqui, Entity () la class decoradora se usa para representar que la Estudiante la class es una entidad. PrimaryGeneratedColumn () la class decoradora se usa para representar que la columna de identificacion es la columna de clave principal de la Entidad de estudiante . Columna () La class de decorador se usa para representar otras columnas como Nombre mit Edad de la entidad Estudiante . Ahora se crea la class de entidad Estudiante . TypeORM generara automaticamente una tabla correspondiente a la entidad Estudiante en nuestra base de datos y se llamara estudiante . Ahora vaya al archivo src/index.tsyagregueelsiguientecodigo:index.ts import "reflect import data { createConnection} from "typeorm import {Student} from " ./ entity / Student // importacion de la entidad Student createConnection (). luego (connection => {console.log ( "Insertar un nuevo registro en la base de datos de estudiantes ... "); // creacion del objeto estudiante const stud = new Student // Asigne aqui el nombre y la edad del estudiante stud.Name = "student1 stud.age = 12; // guardar el objeto del estudiante en la conexion pendiente connection.manager.save (stud); console.log (" Un nuevo usuario registrado tienevec id: "+ stud.id); console.log (" Cargando usuarios desde la base de datos ... "); // Mostrar los registros de estudiantes guardados const estudiantes = esperar la conexion.manager.find ( Student); console .log ( "Usuarios cargados: ", estudiantes); console.log ( "Aqui puedes configurar y ejecutar express / koa / cualquier otro marco. ");}). Catch (error = > console.log (Error)); Aqui, La linea 1-3 importa las classs relevantes, createConnection y Estudiante La linea 5 crea una nueva conexion de base de datos usando createConnection y si la conexion se establece, ejecuta la codigo dentro del bloque luego . La linea 10 crea un nuevo objeto Student, stud. La linea 13-14 define los atributos de nuestro nuevo objeto Stud. La linea 17 guarda la entidad en la base de datos usando el metodo de guardar disponibleen el objeto connection.manager . La linea 23 recupera los detalles del estudiante de la base de datos usando el metodo de busqueda disponible en la conexion . gerente . Inicie el servidor Mysql y ejecute su aplicacion Hemos creado una entidad Student y creado una conexion en index.ts. Iniciemos tanto el servidor MySql como su aplicacion. npm start Esto devolvera la siguiente salida a su pantalla: Salida El servidor mysql abierto que sigue a la tabla estudiante se agrega a su base de datos. Columnas Como se aprendio anteriormente, Entity es en realidad una coleccion de atributos. Como objeto de entidad se refiere a la tabla de la base de datos. Sus atributos / variables miembro se refieren a los campos / columnas de la tabla de base de datos correspondiente. TypeORM admite todos los tipos de campos de base de datos a traves de la class Column. Aprendamos sobre los diferentes tipos de columnas compatibles con TypeORMen este capitulo. @Column () la class decoradora se usa para representar la columna y su tipo en la entidad. Por ejemplo, el atributo de edad de la entidad de estudiante y el tipo de atributo de edad se pueden definir de la siguiente manera: @Column (" int ") edad: entero; // O @Columna ({tipo: "int "}) edad: entero; Aqui, edad es el atributo de la entidad. En otras palabras, la edad es un campo / columna en la tabla de estudiantes en la base de datos. int representa el tipo de columna de edad en la base de datos. TypeORM admite casi todos los tipos disponibles en el popular motor de base de datos. De hecho, TypeORM permite diferentes conjuntos de tipos para cada motor de base de datos. Podemos utilizar cualquier tipo de base de datos compatible con nuestro motor de base de datos sin ningun pproblema. Por ejemplo, el tipo admitido por TypeORM para el motor de base de datos postgresql es el siguiente: 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, timestamp, timestamp sin zona horaria, marca de tiempo con zona horaria, fecha, hora, hora sin zona horaria, hora con zona horaria, intervalo, booleano, booleano, enumeracion, punto, linea, lseg, cuadro, ruta, poligono, circle, cidr, inet, macaddr, tsvector, tsquery, uuid, Asimismo, TypeORM toma admite un conjunto diferente de tipos de datos para MySQL. Opciones de columna TypeORM proporciona un conjunto completo de opciones sin tipo para decire la columna. Por ejemplo, la opcion de longitud se refiere a la longitud del campo de la base de datos y se puede especificar de la siguiente manera: @Column ( "varchar ", {length: 100}) Algunas de las opciones de columna mas comunes son las siguientes: nombre - Nombre de la base de datos / campo de columna. longitud : longitud del campo / columna de la base de datos. Nullable : especifique si el campo / columna de la base de datos permite nulos o no. predeterminado : valor predeterminado para el campo / columna de la base de datos. principal : especifique si el campo / columna de la base de datos es la clave principal de la tabla. unico : especifique si el campo / columna de la base de datos es unico * precision ** - Precision del campo / columna de base de datos escala - escala de campo / dos puntosne base de datos comentario - Comentario o descripcion del campo / columna de la base de datos @ decorador generado TypeORM proporciona decorador, @Generated para generar automaticamente valores de columna. Por ejemplo, un identificador unico universal (UUID) es bastante comun de usar en la base de datos para almacenar un valor unico en una columna. El codigo de muestra para generar el UUID es el siguiente ws - @Entity () export class Student {@PrimaryColumn () id: number; @Column () @Generated ( "uuid ") uuid: cadena; } Aqui, uuid se genera automaticamente y se almacena en la base de datos. Columnas primarias Se requiere al menos un campo de columna primaria para cualquier entidad en la base de datos. Se clasifica en diferentes tipos de decoradores. Lo discutiremos uno por uno. @PrimaryColumn () El decorador @PrimaryColumn () se utiliza para crear una columna principal para cualquier tipo de datos. A continuacion se muestra un ejemplo simple, import {Entity, PrimaryColumn} from "typeorm Export class @Entity () Student {@PrimaryColumn () id : numero;} Aqui, id es un numero entero, que no acepta valores duplicados, pero necesitamos asignar valores. Tambien podemos asignar una columna principal a uno o mas campos, si la situacion lo requiere. Ejemplo importar {Entity, PrimaryColumn} de "typeorm Exportar class @Entity () Student {@PrimaryColumn () id: number; @PrimaryColumn () correo electronico: cadena; @PrimaryColumn () telefono: numero; El campo} @PrimaryGeneratedColumn () @PrimaryGeneratedColumn () se utiliza para especificar la columna principal, asi como para generar automaticamente el valor de la columna en la basede datos . Se muestra a continuacion: importar {Entity, PrimaryGeneratedColumn} from "typeorm Export class @Entity () Student {@PrimaryGeneratedColumn () id: number ;} Aqui, No es necesario que asigne un valor de identificador; sera generado automaticamente por TypeORM en la tabla de la base de datos datos. @PrimaryGeneratedColumn ( "uuid ") @PrimaryGeneratedColumn tambien acepta un argumento para especificar el tipo de generador. Uno de los usos principales es generar un identificador unico basado en UUID. importar {Entity, PrimaryGeneratedColumn} from "type Export @Entity () class Student {@PrimaryGeneratedColumn (" uuid ") id: cadena; } tipo de columna de tabla simple La base de datos relacional avanzada admite el tipo de datos de tabla. Para admitir el tipo de datos de matriz,TypeORM proporciona un tipo de columna especial, * simple-array "para almacenar valores de matriz primitivos. El codigo de muestra para usarlo es el siguiente: @Entity () export class Student {@PrimaryGeneratedColumn () id: number; @Column ( "simple-array ") nombres: cadena;} tipo de columna simple-json Muchos motores de base de datos modernos admiten bases de datos JSON. Para usar el tipo de datos JSON, TypeORM proporciona un tipo especial, single-json. El codigo de muestra para usar este es el siguiente - @Entity () export class Student {@PrimaryGeneratedColumn () id: number; @Column ( "simple-json ") info: {firstName: string , middleName: string, lastName: string};} Este valor se puede establecer en index.ts de la siguiente manera: index.ts const stud = new Student stud.info = {firstName: " John ", middleName: "peter ", apellido: "Michael "}; Columnas especiales TypeORM admite las siguientes columnas especiales @CreateDateColumn - Es una columna especial para definir automaticamente la fecha de insercion de la entidad. @UpdateDateColumn : se utiliza para establecer automaticamente la hora de actualizacion de la entidad. @VersionColumn : establece automaticamente el numero de version de la entidad. Herencia de entidades La herencia de entidades se utiliza para reducir la duplicacion de entidades. Considere las siguientes entidades: Result.ts @Entity () export class Result {@PrimaryGeneratedColumn () id: number; @Column () titulo: cadena; @Column () deion: string; @Column () elegible: string} Grade.ts El codigo para grade.ts es el siguiente: Clase de exportacion@Entity () Grade {@PrimaryGeneratedColumn () id: number; @Column () nombre: cadena; @Column () titulo: cadena; @Column () deion: string; @Column () notacion: cadena; } Aqui, Las dos entidades anteriores tienen columnas id, title y deion. Utilizando la herencia de entidades, creamos una class base de Detalles y combinamos las dos entidades anteriores como se especifica a continuacion. Details.ts exportar class abstracta Detalles {@PrimaryGeneratedColumn () id: number; @Column () titulo: cadena; @Column () deion: string; } Exportar class @Entity () Resultado amplia Detalles {@Column () elegible: cadena} Exportar class @Entity () Grado amplia Detalles {@Column () nombre: cadena; @Column () notacion: cadena; } Ahora inicie su servidor, puede ver la respuesta a continuacion, Ahora abre tu servidor mysql y muevete a tu base de datos, puede ver las siguientes tablas, Tabla de notas Tabla de resultados TypeORM - Relaciones Las relaciones se utilizan para referirse a la relacion entre la tabla en la base de datos. En general, existe una relacion entre dos tablas cuando una de ellas tiene una clave externa que hace referencia a la clave principal de la otra tabla. Esta caracteristica hace que la base de datos relacional sea mas poderosa y almacena informacion de manera eficiente. TypeORM permite vincular entidades entre si y posteriormente a tablas en la base de datos. En general, las relaciones se pueden clasificar en cuatro categorias mas amplias. Son los siguientes: uno a uno : un objeto de la entidad dada se relaciona con un solo objeto de la entidad de destino y viceversa. Por ejemplo, un pais tendra una sola capital e igualmente una ciudad sera la capital de un solo pais. muchos a uno : varios objetos de la entidad dada estan vinculados a un objeto de la entidad de destino. Por ejemplo, una ciudad solo pertenece a un pais, pero el pais puede tener varias ciudades. uno a muchos : igual que muchos a uno, excepto que la relacion se invierte. muchos a muchos : varios objetos de la entidad dada se relacionan con varios objetos de la entidad de destino. Por ejemplo, un articulo puede etiquetarse en varios temas como lenguaje de programacion, finanzas, etc., y al mismo tiempo, una etiqueta en particular tambien puede tener varios articulos. TypeORM tambien proporciona opciones para mejorar la relacion de entidades. Son los siguientes: dispuesto - El objeto de entidad de origen tambien carga los objetos de entidad de destino. cascada : el objeto de la entidad de destino se inserta o actualiza mientras se inserta o actualiza el objeto de la entidad de origen. onDelete : los objetos de la entidad de destino tambien se eliminan mientras se elimina el objeto de la entidad de origen. principal : se utiliza para especificar que la columna de relacion es una clave principal o no. anulable : p utilizadoPara especificar que la columna de relacion es anulable o no. Repasemos en detalle los diferentes tipos de mapeo de relaciones. Uno a uno Como aprendimos anteriormente, es referenciado por la instancia de un campo de tabla que contiene la instancia de "otro campo de tabla y viceversa. Creemos una matriz Detalles - Detalles.ts import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Detalles de la class de exportacion @Entity () {@PrimaryGeneratedColumn () id: number; @Column () gender: string; @Column () country: string;} Creemos otra entidad Cliente como sigue: Customer.ts import {Entity, PrimaryGeneratedColumn, C olumn, OneToOne, JoinColumn} from "typeorm import {Details} from "./ Detalles Clase de exportacion @Entity () Cliente {@PrimaryGeneratedColumn () id: numero; @Column () nombre: cadena; @OneToOne (tipe => Detalles) @JoinColumn () detalles: Detalles; } Aqui, Hemos agregado la asignacion de OneToOne a la tabla Detalles . @JoinColumn () contiene un "ID de relacion" y una clave externa para la tabla Cliente . Podemos guardar la relacion en index.ts de la siguiente manera: const details = new Details details.gender = "woman details.country = " india "espere la conexion.manager.save (detalles); client const = new client customer.name = "client1 "; customer.details = Details; esperar a connection.manager.save (client); Uno a muchos y muchos a uno Como aprendimos anteriormente, la "instancia del primer campo de tabla que contiene las multiples instancias del segundo campo de tabla llamado Mapeo de uno a muchos y multiples instancias de la primera tabla contienen solo una instancia de la segunda tabla llamadoMapeo varios a uno . Tomemos un ejemplo de las entidades Estudiante y proyecto mientras que el estudiante puede trabajar en mas de un proyecto pero cada proyecto es administrado por solo un estudiante. Creemos una entidad Proyecto de la siguiente manera: Proyecto import {Entity, PrimaryGeneratedColumn, Columna, ManyToOne} de "typeorm "; import {Student} from "./ Student Export class @Entity () Project {@PrimaryGeneratedColumn () id: number; Projects @Column (): string; @ManyToOne (type => Student, student => student. proyectos) estudiante: Estudiante;} Ahora creamos la entidad Estudiante como se muestra a continuacion - import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm import {Project} from " ./ Project Export class @Entity () User {@PrimaryGeneratedColumn () id: number; @Column () name : cadena; @OneToMany (tipo => P roject, project => project.student) proyectos: Proyecto; } Aqui, @OneToMany propiedad asignada Proyecto y propiedad @ManyToOne asignada a Estudiante . Sin embargo, @OneToMany no puede existir sin las propiedades @ManyToOne y @ManyToOne que contienen "id de relacion" y una clave externa. Podemos guardar la conexion en index.ts de la siguiente manera: const proj1 = new Project proj1.projects = "la administracion de la base de datos espera la conexion.manager.save (proj1); const proj2 = nuevo proyecto proj2.projects = " la aplicacion web espera la conexion.manager.save (proj2); const stud = new Student stud.name = "Student1 stud.projects = [proj1, proj2]; espera la conexion.manager.save (stud); Many-to-Many Mientras "aprendido previamente, es referenciado por multiples registros en una tabla estan relacionados con multiples registross en otra mesa. Tomemos un ejemplo, un estudiante universitario puede estar matriculado en mas de un curso a la vez, lo que significa que el estudiante puede tener cuatro o cinco classs por semestre y una class puede tener varios estudiantes. Podemos simplemente concluir que un estudiante tiene muchas classs y una class tiene muchos estudiantes. Creemos una entidad para Clases de la siguiente manera: import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Export class @Entity ( ) Clases {@PrimaryGeneratedColumn () id: number; @Column () name: string;} Ahora creamos la entidad Student como se muestra a continuacion - import {Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable} from "typeorm import {Classes} from " ./ Classes Export class @Entity () Student { @PrimaryGeneratedColumn () id: numero; @Column () nombre: cadena; @Column () materias: codio; @ManyToMany (tipo => Clases) @JoinTable () classs: Clases; } TypeORM - Usando el repositorio El repositorio es especifico de una entidad. En otras palabras, cada entidad tendra su propio repositorio incorporado y se puede acceder a el usando el metodo getRepository () del objeto de conexion como se especifica a continuacion - const studRepository = manager.getRepository (Estudiante); Una vez que se crea el objeto del repositorio del estudiante, se puede usar para realizar todas las operaciones de la base de datos del objeto del estudiante. Tipos de repositorio Repositorio se clasifica en cuatro categorias. Son los siguientes: Repositorio Repositorio predeterminado para una entidad y se puede acceder a el utilizando el metodo getRepository () como se especifico anteriormente- debajo - const studRepository = manager.getRepository (Student); De ahora en adelante, studRepository se puede usar para consultar la tabla de estudiantes TreeRepository Se usa para entidades de tipo arbol y es accesible usando el metodo getTreeRepository () como se especifica a continuacion - const studcaRepository = manager.getTreeRepository (Student); MongoRepository Se utiliza en entidades de operacion mongoDB y se puede acceder a el mediante el metodo getMongoRepository () como se especifica a continuacion - const detailsRepository = manager.getMongoRepository (Detalles); CustomRepository Se utiliza para personalizar el repositorio y se accede a el mediante el metodo getCustomRepository () como se especifica a continuacion, const myUserRepository = manager.getCustomRepository (UserRepository); API de repositorio Aprendamos el metodo mas importantee de EntityManager en este capitulo. administrador Podemos acceder a EntityManager usando el metodo de administrador como se especifica a continuacion - const manager = repository.manager; queryRunner El metodo queryRunner devuelve un objeto de ejecucion de consultas personalizado y se utiliza para operaciones de base de datos por repositorio. El codigo de muestra es el siguiente: const queryRunner = repository.queryRunner; datos datos devuelve los datos del repositorio. El ejemplo de codigo es el siguiente: const data = repository.data; consulta consulta ejecuta consultas SQL. Consulta de seleccion simple como se muestra a continuacion - const qur = wait repository.query (`select * from Students`); El metodo insertar insertar se utiliza para insertar una nueva entidad o una matriz de entidades en la base de datos. El codigo de muestra es el siguiente: wait repository.insert ({Nombre: "Estudiante3 ", Edad: 14}); La consulta anterior es equivalente a, insertar en los valores del estudiante (Nombre, edad) ( "Estudiante3 ", 14) actualizar actualizar se utiliza para actualizar los registros existentes en la base de datos. esperar repositorio.update (1, {Nombre: "Adam"}); Esta consulta funciona de manera similar a la que se menciona a continuacion - actualizar el nombre del SET del estudiante = "Adam" donde id = 1 El metodo eliminar eliminar eliminara el registro especificado de la tabla, esperar repository.delete (Estudiante, 1); Esto eliminara al estudiante con la identificacion 1 de la matriz estudiante . Esto es equivalente a, eliminar del estudiante donde id = 1; Si desea eliminar por nombre, utilice la consulta a continuacion, wait repository.delete ({Name: "Student1 "} ); Esta consulta eliminara a todos los estudiantes con el nombre Estudiante1 ** softDelete and restore ** Se usa para borre suavemente los datos y podra restaurar la grabacion segun la identificacion del estudiante. El ejemplo de codigo es el siguiente: wait repository.softDelete (1); Puede restaurar la carpeta del estudiante usando el comando de comunicacion a continuacion y - await repository.restore (1); Otra opcion para eliminar y restaurar es utilizar los metodos softRemove y recuperar . El codigo de muestra es el siguiente: // encuentra las entidades const enty = wait repository.find // const entySoftRemove entidad eliminada suave = esperar repository.softRemove (enty); Y puede recuperarlos utilizando el metodo de recuperacion que se especifica a continuacion, wait repository.recover (entySoftRemove); guardar guardar se usa para guardar la entidad dada en la base de datos. La entidad Student simple se puede guardar como se muestra a continuacion: import {Student} from "./ entity / Student createConnection (). Luego (conexion = > {console.log ( "Insertando un nuevo registro en la base de datos de estudiantes ... "); const stud = new Student stud.Name = "student1 stud.age = 12; await repository.save (stud); Esto agregara un nuevo registro de estudiante a la base de datos. eliminar eliminar se usa para eliminar el "entidad dada en la base de datos. La entidad Simple Student se puede eliminar como se muestra a continuacion: wait repository.remove (stud); count count devuelve el numero de registros disponibles en la tabla y puede usarlo para propositos de paginacion . El ejemplo de codigo es el siguiente: const cnt = wait repository.count (Student, {age: 12}); buscar buscar se utiliza con fines de investigacion. Recupera todos los registros de la base de datos como se muestra a continuacion - const result = await repository.find ({id: 1}); findOne Similar al metodo find , pero devuelve el primer registro coincidente. El ejemplo de codigo es el siguiente: const result = wait repository.findOne ({id: 1}); borrar borrar metodo de clavetodos los datos de la tabla. El codigo de muestra es el siguiente: await repository.clear TypeORM - Trabajar con Entity Manager EntityManager es similar a Repository y se usa para administrar operaciones de base de datos como como insertar, actualizar, borrar y cargar datos. Mientras que Repository administra una sola entidad, EntityManager es comun a todas las entidades y puede realizar operaciones en todas las entidades. API de Entity Manager Podemos acceder a EntityManager usando el metodo getManager () como se especifica a continuacion - import {getManager} from "typeorm const entityManager = getManager Aprendamos el metodo mas importante de EntityManager en este capitulo. conexion El metodo conexion devuelve la conexion ORM de la base de datose datos a una base de datos. El codigo de muestra es el siguiente: const connection = manager.connection; QueryRunner El metodo queryRunner devuelve un objeto de ejecucion de consultas personalizado y el administrador de la base de datos lo utiliza para las operaciones de la base de datos "entidades. El codigo de muestra es el siguiente: const queryRunner = manager.queryRunner; transaccion Si se invocan varias consultas de base de datos, la transaccion se ejecutara en una unica transaccion de base de datos. El codigo de muestra para obtener la transaccion es el siguiente: wait manager.transaction (manager => {}); El metodo query query ejecuta consultas SQL. Solicitud de insercion simple como se muestra a continuacion - const qur = wait manager.query (`insert into student (name, age) willleer ( "stud2 ", 13) `); El metodo insert insert se usa para insertar una nueva entidad o una nueva matriz de entidades en la base de datos. El codigo de muestra es el siguiente: wait manager.insert (Student, {Name: "Student3 ", Edad: 14}); actualizar actualizar se utiliza para actualizar los registros existentes en la base de datos. administrador de espera. actualizar (Usuario, 1, {Nombre: "Adam"}); Esta consulta funciona de manera similar a la consulta SQL a continuacion, UPDATE student SET Name = "Adam" WHERE id = 1 eliminar El metodo de eliminacion eliminara el registro especificado de la tabla, wait manager.delete (Student , 1); Esto eliminara con ID 1 del registro del estudiante. guardar guardar se usa paraGuarde la entidad dada en la base de datos. La entidad Student simple se puede guardar como se muestra a continuacion: import {Student} from "./ entity / Student createConnection (). Luego (conexion = > {console.log ( "Insertando un nuevo registro en la base de datos de estudiantes ... "); const stud = new Student stud.Name = "student1 stud.age = 12; await connection.manager.save (stud);} Esto agregara un nuevo registro de estudiante a la base de datos. El metodo de guardar insertara al estudiante, si el estudiante dado no lo hace no existe en la base de datos. De lo contrario, guardar actualizara el registro del alumno existente en la base de datos. eliminar eliminar es utilizado para eliminar la entidad dada de la base de datos. Estudiante simple, la entidad se puede eliminar como se muestra a continuacion - wait manager.remove (stud ); recuento recuento devuelve el numero de registros disponibles en la tabla y puede usarlo para propositos de paginacion. El ejemplo de codigo es el siguiente: const cnt = wait manager .count (Student, {age: 12}); buscar El metodo buscar se utiliza con fines de busqueda. s todos los registros de la base de datos como se muestra a continuacion - console.log ( "Cargando usuarios desde la base de datos ... ") ; const estudiantes = esperar la conexion.manager.find (Estudiante); console.log ( "Usuarios cargados: ", estudiantes); findOne Similar al metodo find , pero devuelve el primer registro coincidente. El codigo de muestra es el siguiente: const stud = await manager.findOne (Student, 1); clear El metodo clear borra todos los datos de la tabla. El codigo de muestra es el siguientevant - aguardar administrador.clear (Estudiante); TypeORM - Query Builder El Query Builder se utiliza para crear facilmente consultas SQL complejas. Se inicializa desde el metodo Connection y los objetos QueryRunner. Podemos crear QueryBuilder de tres formas. Conexion Tomemos un ejemplo simple de usar QueryBuilder usando el metodo de conexion. importar {getConnection} desde "typeorm const user = esperar getConnection () .createQueryBuilder () .select (" user ") .from (User, " usuario "). where (" user.id =: id ", {id: 1}). tomar uno Administrador de entidades Creemos un generador de consultas usando el administrador de entidades de la siguiente manera: import {getManager} from "typeorm const user = wait getManager (). createQueryBuilder (Usuario, "usuario ") .where ( "usuario.id =: id ", {id: 1}) .getOne Repositorio Podemos utilizar el repositorio para crear un generador de consultas. Se describe a continuacion. a continuacion, import {getRepository} from "typeorm const user = wait getRepository (User) .createQueryBuilder (" user ") .where (" user.id =: id ", {id: 1}) .getOne Alias ​​ Los alias son los mismos que los alias de SQL. Creamos un alias para la tabla Student usando QueryBuilder como se describe a continuacion - import {getConnection} from "typeorm const user = wait getConnection () .createQueryBuilder ( ) .select ( "stud ") .from (Student, "stud ") Esta consulta es equivalente a, select * entre estudiantes como stud Parametros Parametros se utilizan como marcadores de posicion para valores dinamicos en la consulta. En muchos casos, la consulta de encontrar un objy una entidad diferente sera la misma excepto por los valores. Por ejemplo, la consulta para encontrar un estudiante diferente es la misma, excepto por los datos de ID de estudiante . En este caso, podemos usar el parametro para ID de estudiante y luego cambiar el parametro para obtener los diferentes objetos de estudiante. Otro uso importante del parametro es evitar la inyeccion de SQL. Es uno de los agujeros de seguridad mas importantes en las aplicaciones web modernas. Al usar el parametro en la consulta, podemos sobrevivir a los ataques de inyeccion SQL. Otro uso importante del parametro es evitar la inyeccion de SQL. Es uno de los agujeros de seguridad mas importantes en las aplicaciones web modernas. Al usar el parametro en la consulta, podemos sobrevivir a los ataques de inyeccion SQL. Por ejemplo "student.id =: id ", {id: 1} Aqui, : id - nombre del parun metro. {id: 1} - valor del parametro Agregar expresion Esta seccion explica como usar expresiones. donde donde se utiliza para filtrar registros si la condicion coincide. createQueryBuilder ( "estudiante ") .donde ( "estudiante.id =: id ", {id: 1}) Esta consulta es equivalente a, select * from Students student donde student.id = 1; Tambien podemos utilizar las condiciones Y, O, NO, EN dentro. teniendo La expresion simple que tiene una expresion se define a continuacion - createQueryBuilder ( "student ") .having (" student.id =: id ", {id: 1}) Esta consulta es equivalente a, seleccionar * entre estudiantes que estudian con student.id = 1; orderBy orderby se usa para ordenar registrosdependiendo del campo. createQueryBuilder ( "student ") .orderBy ( "student.name ") Esta consulta es equivalente a, seleccione * de Estudiantes Orden de estudiante por estudiante.nombre; groupBy Se utiliza para agrupar registros segun la columna especificada. createQueryBuilder ( "student ") .groupBy ( "student.id ") Esta consulta es equivalente a, seleccione * del grupo de estudiantes por student.id; limite Se utiliza para limitar la seleccion de filas. A continuacion se muestra un ejemplo que muestra como utilizar el limite en el Generador de consultas, createQueryBuilder ( "student ") .limit (5) Esta consulta es equivalente a, seleccionar * del limite de estudiantes estudiantes 5; desplazamiento Desplazamientose utiliza para especificar el numero de filas para ignorar el resultado. Se define a continuacion: createQueryBuilder ( "student ") .offset (5) Esta consulta es equivalente a seleccionar * de la compensacion de los estudiantes estudiantes 5; joins La clausula join se usa para combinar filas de dos o mas tablas, dependiendo de una columna asociada. Considere las dos entidades: Student.ts import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm import {Project} from "./ Project Export class @Entity () User {@PrimaryGeneratedColumn () id: number; @Column () nombre: cadena; @OneToMany (type => Project, project => project.student) proyectos: proyecto; } Project.ts import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm import {Student} from "./ Student Export class @Entity () Project {@PrimaryGeneratedColumn () id: number; @Column () title: string; @ManyToOne (type => Student, student => student.projects) estudiante: Estudiante;} Hagamos una combinacion izquierda simple usando la consulta a continuacion - const estudiante = esperar createQueryBuilder ( "estudiante ") .leftJoinAndSelect (" Student.projects ", " project "). where (" student.name =: name ", {name: " Student1 "}) .getOne Esta consulta es equivalente a, SELECT student. *, project. * FROM estudiantes estudiante LEFT JOIN project project ON project.student = student.id WHERE student.name = "Student1 " De manera similar, tambien podemos probar la union interna. Unir sin seleccion Podemos unir datos sin use select. Probemos este ejemplo usando la combinacion interna de la siguiente manera: const student = await createQueryBuilder ( "student ") .innerJoin ( "student.projects ", "project ") .where ( "student.name =: name ", {nombre: " estudiante1 "}) .getOne La consulta anterior es equivalente a - SELECT estudiante. * DESDE estudiantes estudiante INNER JOIN proyectos proyecto ON project.student = student.id DONDE estudiante.name = "Student1 "; Paginacion Si tiene mas datos en su aplicacion, necesita funciones de paginacion, deslizador de pagina o desplazamiento. Por ejemplo, si desea mostrar los cinco mejores proyectos de estudiantes en su aplicacion, const estudiantes = aguardar a getRepository (Estudiante). createQueryBuilder ( "estudiante ") .leftJoinAndSelect ( "estudiante.proyectos ", "proyecto ") .take (5) .getMany sub-solicitudes Se llama solicitud en otra solicitudte o consulta anidada. Usamos subconsultas en las expresiones FROM, WHERE y JOIN. A continuacion se muestra un ejemplo simple: const projects = await connection .createQueryBuilder () .select ( "project.id " , "id ") .addSelect (subQuery => {return subQuery .select ( "estudiante.nombre ", "nombre ") .from (Estudiante, "estudiante ") .limit (1); }, "nombre ") .from (Proyecto, "proyecto ") .getMany Campo oculto Si alguno de los campos de su columna esta marcado como {select: false}, entonces esa columna se considera una columna oculta. Considere la siguiente entidad: import {Entity, PrimaryGeneratedColumn, Column} from "typeorm @Entity () export class Student {@PrimaryGeneratedColumn () id : numero; @Column () nombre: cadena; @Column ({select: false}) direccion: cadena;} Aqui, El campo direccion esta marcado como oculto . NPodemos usar addSelect para recuperar la informacion de la columna. Se define a continuacion, const student = await connection.getRepository (Student) .createQueryBuilder (). select ( "student.id ", "student ") .addSelect ( "student.address ") .getMany getSql () Esto se usa para obtener la consulta SQL generada por el constructor de consultas. Se define a continuacion: const sql = createQueryBuilder ( "student "). Where ( "student .name =: name ", {name: "Student1 "}) .orWhere ( "student.age =: age ", {age: 14}) .getSql TypeORM - Operaciones de consulta La manipulacion de datos se utiliza para administrar y mostrar datos. Esta seccion explica como acceder a las consultas de la base de datos, como insertar, actualizar, seleccionar y eliminar consultas utilizando QueryBuilder. Vamonosrevise uno por uno en detalle. Cree una solicitud de insercion Creemos una entidad Cliente de la siguiente manera: Cliente .ts import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Export class @Entity () Client {@PrimaryGeneratedColumn () id: number; @Column () name: string; @ Column () age: number;} Agreguemos los siguientes cambios en index.ts de la siguiente manera: index.ts importar "espejo- importar datos {createConnection} desde " typeorm importar {Cliente} desde "./ entidad / Cliente importar {getConnection} desde " typeorm createConnection (). luego (conexion => {esperar getConnection (). createQueryBuilder () .insert () .into (Cliente) .values ​​([{nombre: "Adam", edad: 11}, {nombre: "David ", edad: 12}]) .execute ( );}). catch (error => console.log (error)); Ahora inicia tu aplicacion usando el siguiente comando - npm start Salida Es posible que vea la siguiente salida en su pantalla: Ahora abra su servidor mysql, inserte la tabla con dos campos como se muestra a continuacion - Crear consulta de actualizacion En la ultima seccion, insertamos dos filas de datos. Veamos como funciona la consulta de actualizacion. Agregue los siguientes cambios en index.ts de la siguiente manera - import "reflect-data import {createConnection} from " typeorm import {Client} from "./ entity / Client import {getConnection} from " typeorm createConnection (). then (connection => {asiste a getConnection () .createQueryBuilder () .update (Cliente) .set ({nombre: "Michael "}) .where ( "id =: id ",{id:1}).executeconsole.log("datos actualizados ");}). Catch (error => console.log (error)); Ahora inicia tu aplicacion usando el siguiente comando: npm start Puede ver el siguiente resultadote en tu pantalla - La tabla Mysql est modificado como se muestra a continuacion - ElLa consulta Build Select select se utiliza para mostrar los registros de la tabla. Agreguemos el siguiente codigo en index.ts de la siguiente manera: index.ts import "reflect-data import {createConnection} de "typeorm import {Client} from " ./ entity / Client createConnection (). luego (conexion => {console.log ( "Mostrar registros de la tabla de clientes ... "); const cus = new client console.log ( "Cargar clientes desde la base de datos ... "); const clients = esperar conexion.manager.find (Cliente); console.log ( "Usuarios cargados: ", clientes);}). catch (error => console.log (error)); Es posible que veas el siguiente resultado en tu pantalla: expresion where Agreguemos la expresion where en la consulta para filtrar los clientes. El codigo de muestra es el siguiente: importar "reflect-data import {createConnection} desde " typeorm import{Cliente} de "./ entidad / Importacion de cliente {getConnection} de " typeorm createConnection (). entonces (conexion => {cliente constante = esperar getConnection () .createQueryBuilder () .select ( "cus ") .from (Cliente, "cus ") .donde ( "cus.id =: id " , {id: 1}) .getOne console.log (cliente);}) .catch (error => console.log (error)); El programa anterior devolvera los primeros registros de identificador. Puede ver el siguiente resultado en su pantalla, Del mismo modo, tambien puede probar otras expresiones. Crear consulta de eliminacion Última seccion, insertamos, actualizamos y datos seleccionados. Veamos como funciona la consulta de eliminacion. Agregue los siguientes cambios en index.ts de la siguiente manera: import "reflect-data import {createConnection} from "typeorm import {Client} from " ./ entity / Client import {getConnection} from "typeorm createConnection (). luego (connection => {await getConnection () .createQueryBuilder () .delete () .from (Cliente). where ( "id =: id ", {id: 1}) .execute console.log ( "datos eliminados ");}). catch (error => console.log (error)); Podrias ver la f despues del resultado en tu pantalla - Y su tabla mysql se modifica de la siguiente manera: TypeORM - Transacciones Por lo general, la transaccion es una unidad logica responsable de realizar la recuperacion y actualizacion de datos. Esta seccion explica las transacciones en detalle. Creacion de transacciones Podemos crear una transaccion usando ya sea conexion o EntityManage. El siguiente ejemplo se utiliza para especificar crear una conexion y guardar los datos en su interior. import {getConnection} from "typeorm espera getConnection (). transaccion (transactionalEntityManager => {espera la conexion.manager.save (estudiantes);}); EntityManager se muestra a continuacion: import {getManager}from "typeorm wait getManager (). transaction (transactionalEntityManager => {wait transactionalEntityManager.save (estudiantes);}); Decoradores Tenemos tres tipos de decoradores relacionados con transacciones en TypeORM. @Transaction : envuelve toda la ejecucion en una sola translacion de base de datos. @TransactionManager : se utiliza para ejecutar consultas dentro de la transaccion. Se define a continuacion, @Transaction ({aislamiento: " SERIALIZABLE "}) guardar (@TransactionManager () administrador: EntityManager, estudiante: Estudiante) {return manager.save (estudiante);} Aqui, Usamos el nivel de aislamiento SERIALIZABLE para la transaccion. @TransactionRepository - Se utiliza para inyectar la transaccion en el repositorio. Se define a continuacion, @Transaction () save (student: Student, @TransactionRepository (Student) studentRepository: Re pository ) {return studentRepository.save (student);} Transaccion en QueryRunner QueryRunner se usa para ejecutar todas las consultas de la base de datos. Tiene solo una conexion a la base de datos. La transaccion de la base de datos se puede organizar usando QueryRunner . Ejecutemos una sola transaccion con QueryRunner . import {getConnection} from " typeorm // obtener una conexion y crear un nuevo lanzador de consultas const connection = getConnection const queryRunner = connection.createQueryRunner // Establezca una conexion real a la base de datos usando nuestro nuevo lanzador de consultas wait queryRunner.connect // ahora podemos ejecutar todas las consultas en un ejecutor de consultas, por ejemplo: esperar queryRunner.query ("SELECCIONAR * DE estudiantes "); Ahora inicie la transaccion usando la siguiente instruccion - espera queryRunner.startTransaction A continuacion, confirme y revierte la transaccion usando la instruccion siguiente, try {await queryRunner.commitTransaction } Si hay un error, es manejado por catch (), catch (err) {// ya que tenemos los errores revertiran los cambios que hicimos esperar queryRunner.rollbackTransaction } Ahora libera el queryRunner como se muestra a continuacion - finalmente {// tienes que liberar el lanzador de consultas que se crea manualmente: espera queryRunner.release } TypeORM - Índices En general, Indexacion es un proceso de optimizacion del rendimiento de una base de datos mediante optimalmacenamiento de datos. Le permite localizar y acceder rapidamente a los datos en una base de datos. Esta seccion explica como utilizar el indice en TypeORM. Los indices se clasifican en diferentes tipos. Repasemos uno por uno en detalle. Índices de columna Podemos crear un indice para una columna en particular usando @Index . Considere un ejemplo de entidad Cliente como se muestra a continuacion y un indice definido para la columna nombre , import {Entity, PrimaryGeneratedColumn, Column} from " typeorm Export class @Entity () Student {@PrimaryGeneratedColumn () id: number; @Index () @Column () firstName: string; @Column ( ) lastName: string; @Column () age: number; @Column () address: string;} @Index tambien le permite especificar el nombre de un indice - @Index ( "Name-idx ") @Column () firstName: string; IndIces unicos Para especificar restricciones unicas en su columna, utilice la propiedad a continuacion: {unique: true} Por ejemplo, a continuacion se muestra un codigo para especificar un indice unico para la columna Nombre - @Index ({unique: true }) @Columna () nombre: cadena; Para aplicar indices a varias columnas, podemos especificarlo directamente despues de @Entity (). El ejemplo de codigo es el siguiente: @Entity () @Index ([ "firstName ", "lastName "]) @Index ([ "firstName ", "lastName "], {unique: true}) Índices espaciales El indice espacial proporciona acceso a objetos espaciales. MySQL y PostgreSQL admiten indices espaciales. Para habilitar los indices espaciales en su columna, agregue la siguiente propiedad: {espacial: true} El tipo espacial tiene varios subtitulostipos como geometria, punto, cadena de linea, poligono, etc., por ejemplo, si desea agregar un tipo espacial de punto en su columna, use el codigo a continuacion: @Column (" punto ") @Index ({espacial: verdadero}) punto: cadena; Deshabilitar la sincronizacion Para deshabilitar la sincronizacion, use la siguiente opcion en @Index decorador - {synchronize: false} TypeORM - Entity Listener and Logging Entity listener se usa en entidades que admiten metodos personalizados y escuchan eventos especifico. Podemos definir cualquier metodo personalizado de entidad usando decoradores. Entendamos a los decoradores en foco. @AfterLoad - Cuando la entidad se carga usando QueryBuilder o el repositorio / administrador, este metodo sera llamado. @BeforeInsert : este metodo sera llamado antes de insertar la entidad usando el repositorio / administrador. @AfterInsert : este metodo se llamara despues de insertar la entidad usando el repositorio / administrador. @BeforeUpdate : este metodo lo llamara antes de que una entidad existente se actualice mediante el repositorio / administrador. @AfterUpdate : se llamara despues de actualizar una entidad. @BeforeRemove : se llamara antes de que se elimine una entidad. @AfterRemove : se llamara despues de eliminar una entidad. Suor El suor se utiliza para escuchar eventos de una entidad especifica. Se implementa desde EntitySubscriberInterface . Veamos un ejemplo simple del uso del detector de entidades en el suor. Considere que la entidad Student se muestra a continuacion: Student.ts import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Export class @Entity () Student {@PrimaryGeneratedColumn () id: number; @Column () Name: string; @Column () edad: numero;} Crear un suor de estudiante El suor se crea usando el siguiente comando - typeorm subscriber: create -n StudentSubscriber El comando anterior crea un directorio de suores en tu proyecto src.Luego,secreaelarchivoStudentSubscriber.tsentusuor.Puedesverlasiguienterespuesta, El suor /Users/workspace/TypeORM/FirstProject/src/subscriber/StudentSubscriber.tssehacreadocorrectamente.StudentSubscriber.ts importar {EventSubscriber, EntitySubscriberInterface} de "typeorm Exportar class @EventSubscriber () StudentSubscr iber implementa EntitySubscriberInterface {} Ahora agregue los siguientes cambios al archivo, import {EventSubscriber, EntitySubscriberInterface, InsertEvent} from "typeorm importar {alumno} de "../ entidad / alumno La class de exportacion @EventSubscriber () StudentSubscriber implementa EntitySubscriberInterface {listenTo () {return Student; } afterInsert (evento: InsertEvent ) {console.log (evento); }} Aqui, Usamos el metodo afterInsert () para llamar al evento de entidad. Asimismo, tambien puede utilizar otros eventos. Ya hemos configurado el archivo ormconfig.json. Ahora agregue los cambios siguientes al archivo index.ts de la siguiente manera: index.ts importar "refleja -data import {createConnection} de " typeorm import {Student} from "./ entity / Student createConnection (). luego (conexion hrone => {console.log ( "conexion establecida ");}). catch (error => console.log (error)); Despues de ejecutar la aplicacion, puede ver el resultado a continuacion en su pantalla, Registro El registro de la base de datos es una parte importante del diseno de su solucion de base de datos de alta disponibilidad porque los registros base los datos le permiten recuperarse de una falla y permiten la sincronizacion de las bases de datos primarias y secundarias. Todas las bases de datos tienen registros asociados. Estos registros mantienen registros de cambios Si es necesario restaurar una base de datos a un punto posterior a la ultima copia de seguridad completa sin conexion, se necesitan registros para mover los datos al punto de falla. Opciones de registro El registro se habilita agregando {logging: true} en la conexion a la base de datosdatos. Las opciones de registro se clasifican en diferentes tipos. Son las siguientes: consulta : devuelve todas las consultas de registro. Se define como se muestra a continuacion: {host: "localhost ", ... logging: [ "query "]} error : devuelve registros de todas las solicitudes fallidas y errores. Se define a continuacion: {host: "localhost ", ... logging: [ "error "]} esquema : devuelve registros de esquema. advertir : devuelve advertencias internas de ORM. informacion : devuelve mensajes informativos internos de ORM. log : devuelve mensajes de registro ORM internos. Registrador personalizado El registro personalizado es una opcion de registro simple y altamente personalizable. Podemos crear nuestra propia class de registro usando el siguiente codigo: importar {Logger} de "typeorm export class MyCustomLogger implementa Logger {// implementar todos los metodos de la class logger} La opcion La conexion se especifica en ormconfig.json de la siguiente manera: nombre: "mysql ", tipo: "mysql ", host: "localhost ", puerto: 3306, nombre de usuario: "root ", contrasena: "root ", dat abase: "test ", logger: new MyCustomLogger () TypeORM con JavaScript El lenguaje predeterminado admitido por TypeORM es TypeScript . Dado que TypeScript admite escritura estatica, classs y decoradores facilita la definicion de la entidad y sus atributos. Al mismo tiempo, JavaScript tambien es necesario en algunos proyectos donde el idioma preferido es JavaScript. TypeORM tambien proporciona compatibilidad total con el lenguaje JavaScript. Compatibilidad con la version TypeORMes5 y es6 de JavaScript. En este capitulo, aprendamos a escribir la aplicacion TypeORM en JavaScript ES5 (ECMAScript 5). Abra un simbolo del sistema y vaya a su espacio de trabajo. cd / ruta / a / espacio de trabajo / Ejecute el siguiente comando para crear un proyecto TypeORM. typeorm init --name typeorm-java-student-app --database mysql Abra el archivo package.json para eliminar las referencias de typecipt. origin al { "nombre ": "typeorm-java-student-app ", "version ": "0.0.1 ", "deion ": "Increible proyecto desarrollado con TypeORM. ", "DevDependencies ": { "ts-node ": "3.3.0 ", "@ tipos / nodo ": " ^ 8.0.29 ", " tipo ": " 3.3.3333 "}, " dependencias ": {" typeorm ": " 0.2.24 " , "Reflect-data ": "^ 0.1.10 ", "mysql ": "^ 2.14.1 "}, "s ": { "inicio ": " ts-node src/index.ts"}}actualizado {" nombre ": " typeorm-java- Student-app ", " version ": " 0.0.1 ", " deion ": " Impresionante proyecto desarrollado con TypeORM. ", " Dependencias ": {" typeorm ": " 0.2.24 ", " mysql ": " ^ 2.14.1 "}, " s ": {" inicio ": " node src/index.js"}}Aqui, Eliminacion de devDependencies y el paquete asociado con el typScript en la seccion dependencias . Se cambio el principio para que apunte al codigo java en lugar del codigo escrito. Ejecute el siguiente comando para instalar los paquetes necesarios. npm install Elimine tsconfig. json y el archivo index.ts. Elimine el archivo User.ts en la carpeta de la entidad, luego cree una entidad de estudiante en formato json, estudiante.json como se especifica aqui -abajo - {" nombre ": " Estudiante ", " columnas ": {" id ": {" principal ": verdadero, " tipo ": " int " , "generado ": verdadero}, "nombre ": { "tipo ": "varchar "}, "edad ": { "tipo ": "entero "}} } Cree un nuevo archivo, src/index.jsetpongaelcodigoacontinuacion- var typeorm = require ( "typeorm "); var EntitySchema = typeorm .EntitySchema; typeorm.createConnection ({ "type ": "mysql ", "host ": "localhost ", "port ": 3306, "username ": "root ", " contrasena ": " 123456 ", " base de datos ": " typeorm_test_db ​​", " sincronizar ": verdadero, " registro ": falso, entidad: [new EntitySchema (require ( ". /entity/student.json "))]}) .then (function (connection) {return connection.getRepository ( "Student ");}) .then (function (studentRepository) {var student = { nombre: "Estudiante1 ", edad: 18}; devuelva el repositorio del estudiante.save (estudiante) .entonces (funcion (estudiante guardado) {consola.log ( "El estudiante ha sido exitosamenteSaved: ", SavedStudent); return StudentRepository.find }). then (function (estudiantes) {console.log (" Todos los estudiantes: ", estudiantes); return;}) .catch (function ( error) {console.log ( "Error: ", error); return;})}) .catch (function (error) {console.log ( "Error: ", error) return;}); Aqui, Usamos los mismos metodos typeORM excepto por las modificaciones mencionadas a continuacion, Use EntitySchema para configurar la entidad del estudiante. Usando los bloques del concepto JavaScript Promise (luego / catch / finalmente). Ahora ejecute la aplicacion usando el siguiente comando - npm start La aplicacion inserta informacion del estudiante en la base de datos, luego recupera a todos los estudiantes de la base de datos y los muestra en la consola como se muestra a continuacion - > [tipo de correo electronico protegido] inicio / ruta / -java-student-p> node src/index.jsEstudianteregistradoexitosamente:{nombre:"Estudiante1",edad:18,id:1}Todoslosestudiantes:[{id:1,nombre:"Estudiante1",edad:18}]TypeORM-WorkwithMongoDBEstecapituloexplicaelmanejoextendidodelacargadelabasededatosMongoDBproporcionadaporTypeORM.Esperamosquehayamosinstaladomongodusandonpm.S"iln"noesta"instalado"yaque"s"noestainstalado,use"noestainstalado,use"p>npminstallmongodb--saveCreandounproyectoCreemosunnuevoproyectousandoMongoDBdelasiguientemanera- typeorm init --name MyProject --database mongodb Configurar ormconfig.json Configuremos las opciones de host, puerto y base de datos de MongoDB en el archivo ormconfig .jsoncomo se especifica a continuacion - ormconfig.json { "type ": "mongodb ", "host ": "localhost ", "puerto ": 27017, "base de datos ": "prueba ", "sincronizar ": verdadero, "registro ": falso, "entidades ": [ " src/entidad/**/*.ts"],"migraciones":[" src/migracion/**/*.ts"],"suores":[" src/subscriber/**/*.ts"],"cli":{"entityDir":" src/entity","migrationsDir":" src/migration","subdirectorio":" src/subion"}}DefineentitiesandcolumnsCreemosunanuevaentidadllamadaStudentinyourdirectoriesrc.Theentitiesandcolumnsareidenticas.Generateaprimarykeycolumnp>@PrimaryGeneratedColumn.Sepuededefinircomo@ObjectIdColumn.Acontinuacionsemuestraunejemplosencillo:Student.ts importar {Entity, ObjectID, ObjectIdColumn, Column} de "typeorm Exportar class @Entity () Student {@ObjectIdColumn () id: ObjectID; @Column () Nombre: cadena; @Column () Pais: cadena; } Para guardar esta entidad, abra el archivo index.ts y agregue los siguientes cambios: index.ts import "reflect import {createConnection} data from " typeorm import {Student} from "./ entity / Student createConnection (). luego (connection => {console.log (" Inserta un nuevo estudiante en base de datos ... "); const std = new Student std.Name = " Student1 std .Country = "India espera conexion.manager.save (std); console.log (" A registro un nuevo usuario con el ID: "+ std.id); console.log (" Cargando usuarios desde la base de datos ... "); const stds = esperar connection.manager.find (Student); console.log ( "Usuarios cargados: ", stds); console.log ( "TypeORM con MongoDB ");}) .catch (error => console.log (error)); Ahora inicie su servidor y obtendrala siguiente respuesta: npm start MongoDB EntityManager Tambien podemos usar EntityManager para recuperar datos. A continuacion se muestra un ejemplo simple - importar {getManager} desde "typeorm const manager = getManager resultado constante = aguardar administrador.findOne (Estudiante, {id: 1}); De manera similar, tambien podemos usar el repositorio para acceder a los datos. importar {getMongoRepository} desde "typeorm const studentRepository = getMongoRepository (Student); const result = await studentRepository.findOne ({id: 1}); Si desea filtrar los datos utilizando la opcion igual de la siguiente manera: import {getMongoRepository} from "typeorm const studentRepository = getMongoRepository (Student); resultado constante = esperar repositorio_estudiante.find ({donde: {Nombre: {$ eq: "Estudiante1 "},}}); Como hemos visto en este capitulo, TypeORM faciLite utilizando el motor de base de datos MongoDB. TypeORM con Express Express es uno de los frameworks JavaScript mas populares para construir una aplicacion web. Aprendamos a usar TypeORM con el marco express en este capitulo. Cree una aplicacion simple TypeORM La CLI proporciona una opcion simple para crear una aplicacion web express completamente funcional (aplicacion Restful API) integrada con EscribaORM . El comando CLI para crear la aplicacion es el siguiente: cd / path / to / workspace typeorm init --express --name typeorm-express-sample - base de datos mysql El comando anterior creara una nueva aplicacion web en la carpeta typeorm-express-sample. La estructura de la aplicacion es la siguiente: │ .gitignore │ ormconfig.json │ package.json │ README.md │ tsconfig.json │ └─── src│index.ts│routes.ts│├───controller│UserController.ts│├───entity│User.ts│└───migrationAqui,Comotenemosjabones,ormconfig.jsoneselarchivodeconfiguracionEscribaORM.Lecodeisnext, { "type ": "mysql ", "host ": "localhost ", "puerto ": 3306, " nombre de usuario ": " prueba ", " contrasena ": " prueba ", " base de datos ": " prueba ", "sincronizar ": verdadero, "registro ": falso, "entidades ": [ " src/entidad/**/*.ts"],"migraciones":[" src/migracion/**/*.ts"ский,"Subscribers":::" src/subscriber/**/*.ts";;"cli":Danemark"entityDir":" src/entity","migrationsDir":" src/migration","subscribersDir":" src/subion"aurusAqui,cambieelparametrodelabasededatosparaquecorrespondaaestaguiadesubasededatos.p>package.jsoneslaconfiguracionprincipaldelaaplicacion.Elarchivotsconfig.jsoncontienelaconfiguracionrelativaaTypeScript.LedossierentidadcontienemodelosTypeORM.UnmUsuariopredeterminadocreadoporCLIetilsepresentecommesuit- import {Entity, PrimaryGeneratedColumn, Column} from "typeorm Export class @Entity () User {@PrimaryGeneratedColumn ( ) id: numero; @Column () firstName: string; @Column () lastName: string; @Column () edad: numero; La carpeta} controlador contiene los controladores express. CLI crea un controlador de API de usuario predeterminado con agregar / listar / eliminar detalles de usuario. El codigo es el siguiente: import {getRepository} from "typeorm import {NextFunction, Request, Response} from " express import {User} from "../ entidad / User export class UserController {private userRepository = getRepository (Usuario); cronizar todo (solicitud: solicitud, respuesta: respuesta, siguiente: funcion siguiente) {devolver this.userRepository.find } uno (solicitud: solicitud, respuesta: respuesta, siguiente: NextFunction) {return this.userRepository.findOne (request.params.id); } guardar (solicitud: solicitud, respuesta: respuesta, siguiente: funcion siguiente) {devolver this.userRepository.save (request.body); } eliminar (solicitud: solicitud, respuesta: respuesta, siguiente: funcion siguiente) {dejar userToRemove = esperar this.userRepository.findOne (request.params.id); espere this.userRepository.remove (userToRemove); }} Aqui, el metodo all se utiliza para recuperar todos los usuarios de la base de datos. a se utiliza para recuperar un solo usuario de la base de datos mediante el metodo id de usuario guardar se utiliza para guardar la informacion del usuario en la base de datos. El metodo eliminar se usa para eliminar al usuario de la base de datos usando ID de usuario route.ts asigna los metodos del controlador de usuario a la URL correcta y el codigo es el siguiente: importar {UserController} desde "./ controller / UserController export const Routes = [{metodo: " get ", ruta: " / users ", controlador: UserController, accion: "todos "}, {metodo: "obtener ", ruta: "/ usuarios /: id ", controlador: UserController, accion: "uno "}, {metodo: "publicar ", ruta: "/ usuarios ", controlador: UserController, accion: "guardar "}, {metodo: "eliminar ", ruta: "/ usuarios /: id ", controlador: UserController, accion: "remove "}]; Aqui, / La URL de / Users se asigna al controlador del usuario. Cada verbo de publicacion, obtencion y eliminacion se asigna a diferentes metodos. Finalmente, index.ts es nuestro principal punto de entrada a la aplicacion web. El codigo source es el siguiente: import " reflect-data import {createConnection} from "typeorm import * as express from " express import * as bodyParser from "body-parser import {Reques decir, Respuesta} desde "importacion rapida {Rutas} desde " ./ rutas importar {Usuario} desde "./ entidad / Usuario createConnection (). luego (conexion => {// crear aplicacion rapida const app = express ( ); app.use (bodyParser.json ()); // registra rutas rapidas desde rutas de aplicacion definidas Routes.forEach (route => {(app as any) [route.method] (route.route , (req: Request, res: Response, next: Function) => {const result = (new (route.control r as any)) [route.action] (req, res, next); if ( Promise instancia de resultado) {result.then (result => result! == null && result! == undefined? Res.send (result): undefined);} else if (result! == null && result! == undefined) {.json (resultado);}});}); // configure la aplicacion express aqui // ... // inicie la aplicacion del servidor express.listen (3000); // inserte nuevos usuarios para la prueba a la espera de connection.manager.save (connection.manager.create (Usuario, {firstName: "Timber ", lastName: "Saw ", edad: 27})); espere connection.manager.save (connection.manager.create (Usuario, {firstName: "Phantom ", lastName: "Assassin ", edad: 24})); console.log ( "El servidor Express se inicio en el puerto 3000. Abra http: // localhost: " " 3000 / users para ver los resultados ");}). catch (error => console. log (error)); Aqui la aplicacion configura las rutas, inserta dos usuarios y luego lanza la aplicacion web en el puerto 3000 . Podemos acceder al "aplicacion en http://localhost:""3000 Para ejecutar la aplicacion, siga los pasos a continuacion: Instalemos los paquetes necesarios usando el siguiente comando: npm install Salida npm creo un archivo de bloqueo como paquete -lock.json. Debe validar este archivo. npm WARN [correo electronico protegido] Sin campo de repositorio. Npm WARN [email protected] Sin campo de licencia. Se agregaron 176 paquetes de 472 contribuyentes y se auditaron 351 paquetes en 11.965s 3 paquetes estan buscando financiamiento ejecutar` npm fund` para obtener detalles encontrados 0 vulnerabilidades Ejecute el siguiente comando para iniciar la aplicacion. npm start Salir > ts-node src/index.tsTheExpressserverseinicioenport3000.Openhttp://localhost:""3000/usuariosparaverlosresultadosAccedamosanuestraaplicacionWebAPId"cationusingcurlcommandcomosemuestraacontinuacion: curl htt p: // localhost: 3000 / users Aqui, curl es una aplicacion de linea de comandos para acceder a una aplicacion web desde un simbolo del sistema. Admite todos los verbos HTTP como obtener, publicar, eliminar, etc. Salida [{ "id ": 1, "firstName ": "Timber ", "lastName ": "Saw ", "age ": 27}, { "id ": 2, "firstName ": "Phantom ", "lastName ": "Assassin ", "age ": 24}] Para recuperar el primer registro, podemos usar el siguiente comando: curl http: // localhost: " "3000 / users / 1 Salida {" id ": 1, " firstName ": " Timber ", " lastName ": " Saw ", " age ": 27} Para eliminar un registro de usuario, podemos usar el siguiente comandobajo - curl -X DELETE http: // localhost: " "3000 / users / 1 Como lo tenemos Vimos en este capitulo, TypeORM se puede integrar facilmente en una aplicacion rapida. TypeORM - Migraciones La migracion es como el control de versiones de su base de datos. Se utiliza para modificar y compartir el esquema de la base de datos de la aplicacion. Esta seccion explica como funcionan las migraciones en TypeORM. Crear una nueva migracion Para crear una nueva migracion primero debemos configurar la conexion en ormconfig.json. Se define a continuacion - ormconfig.json " tipo ": " mysql ", " host ": " localhost ", " puerto ": 8889, " nombre de usuario ": " root ", " contrasena ": " raiz ", " base de datos ": " Biblioteca ", " entidades ": [" entidad / *. js "], " migrationsTableName ": " estudiante_migracion_tabla ", " migraciones ": [" migracion / *. js "], " cli ": {" migrationsDir ": " migration "} Aqui, migrationsTableName : hace referencia al nombre de la tabla de migracion. migraciones : TypeORM carga las migraciones desde el directorio especificado. cli : indica que la migracion se creara en el directorio especifico. Crear una entidad Libro Creemos una entidad llamada Libro entidad en sr c / entidad / Libro.ts de la siguiente manera: import {Entity, Column, PrimaryGeneratedColumn} de "typeorm "; Exportar class @Entity () Libro {@PrimaryGeneratedColumn () id: number; @Column () title: string; @Column () text: string;} Ejecute la CLI para crear una nueva migracion Ahora podemos ejecutar una nueva migracion usando la CLI de la siguiente manera: Sintaxis migracion de typeorm: create -n Ejemplo migracion de typeorm: create -n myMigration Despues de ejecutar el comando anterior, puede ver la respuesta a continuacion: Migracion / ruta / a / proyecto / src/migracion/1587101104904-myMigration.tsasehageneradocorrectamente.Ahorapasealarchivosrc/migration/1587101104904-myMigration.tsconesteaspecto. import {MigrationInterface, QueryRunner} de "typeorm La class de exportacion myMigration1587101104904 implementa MigrationInterface {public up (queryRunner: QueryRunner): Promise {} public down (queryRunner: QueryRunner): Promise {}} Aqui, Tenemos dos metodos arriba y abajo . El metodo arriba se usa para agregar cambios en la migracion y el metodo down se utiliza para revertir los cambioscambios en su migracion. Agreguemos al archivo myMigration.ts como se especifica a continuacion - importar {MigrationInterface, QueryRunner} from "typeorm the Book1587131893261 export class implementa MigrationInterface {public up (queryRunner: QueryRunner): Promise {await queryRunner.query (` ALTER TABLE book ADD COLUMN price int`);} public down (queryRunner: QueryRunner): Promise {}} Aqui, Agregamos una nueva columna precio dentro de tabla de libros . Ahora ejecute la CLI para agregar los cambios anteriores. ts-node ./node_modules/typeorm/cli .js migracion: ejecutar El comando anterior ejecuta las migraciones y las ejecuta en una secuencia. Ahora puede ver los cambios a continuacion en su pantalla - Salida Ahora abra su servidor mysql, se agrega una nueva columna. Se muestra a continuacionous - Del mismo modo, podemos modificarel tipo de datos del titulo de la columna en varchar (30) de la siguiente manera, import {MigrationInterface, QueryRunner} from "typeorm la class de exportacion Book1587131893261 implementa MigrationInterface {public up (queryRunner: QueryRunner): Promise {espera queryRunner.query (`ALTER TABLE book MODIFY COLUMN title varchar (30)`);} public down (queryRunner: QueryRunner): Promise {}} Ahora ejecute el mismo comando y podra realizar los cambios a continuacion: ts-node ./node_modules/typeorm/cli.js migracion: ejecutar Salir Libro se edita como, Regrese a la migracion Agreguemos el siguiente codigo en el metodo down para deshacer la migracion - import {MigrationInterface, QueryRunner} from " typeorm la class de exportacion Book1587131893261 implementa MigrationInterface {public up (queryRunner: QueryRunner): Promise {} public down (queryRunner: QueryRunner): Promise {esperar queryRunner.query (`ALTER TABLE precio de la columna de ca ida del libro`); // deshacer cosas hechas en el metodo "up "}} Ahora ejecute el siguiente comando para deshacer todos los cambios - ts-node ./node_modules/typeorm/cli.js migracion: revert Puede ver la siguiente respuesta: Salir La tabla de libros se cambia como, Salida Como hemos visto en este capitulo, TypeORM hace que sea mas facil escribir uno de migracion de base de datos. TypeORM - Trabajar con CLI Esta seccion explica en detalle los comandos de CLI de TypeORM. Crear un proyecto de TypeORM typeorm init es la forma mas facil y rapida de configurar un proyecto de TypeORM. Puede crear un nuevo proyecto como, typeorm init --name Demoproject --database mysql Despues de ejecutar el comando obtendra la siguiente salida en su pantalla - Proyecto cree en el directorio / Users / workspace / TypeORM / Demoproject. Crear entidad Para crear una nueva entidad usando CLI como, typeorm entidad: create -n Person Ahora la entidad Person se crea en el srcdeldirectoriodesuproyecto. Entity /Users/workspace/TypeORM/Demoproject/src/entity/Person.tsasehacreadoconexito.Sitieneunaestructuradeproyectodevariosmodulosconvariasentidadesendiferentesdirectorios,puedeutilizarelsiguientecomando, typeorm entidad: crear - n Persona -d src/Persona/entidadCrearunnuevosuorParacrearunnuevosuorusandoCLIcommeuit- typeorm subion: create -n PersonSubscriber Puede ver la siguiente respuesta - Subscriber / path / to / TypeORM / Demoproject / src/subscriber/PersonSubscriber.tssehacompletadoconexito.CreatemigracionesPuedecrearunanuevamigracionusandolaCLIcomosemuestraacontinuacion: migracion de typeorm: create -n PersonMigration El comando arriba creo un directorio de migracion en su proyecto src.Losarchivosdemigracionsealmacenan. Migration /path/to/TypeORM/Demoproject/src/migration/1587395030750-PersonMigration.tsasehageneradocorrectamente.EsquemadebasededatosParasincronizarunesquemadebasededatos,utiliceelsiguientecomando: typeorm esquema: sync Para eliminar completamente un esquema base de datos, use el siguiente comando: esquema de typeorm: eliminar consultas SQL Si desea ejecutar consultas sql, podemos ejecutar directamente desde aqui. Por ejemplo, para ver todos los registros de clientes, utilice la siguiente consulta: typeorm query "select * from customers " Si desea borrar todo lo almacenado en la cache. Puede hacer esto usando el siguiente comando - typeorm cache: clear Conclusion TypeORM es un excelente ORM abierto marco de origen para crear aplicaciones escalables y de alta calidad, desde aplicaciones de pequena escala hasta aplicaciones empresariales de gran escala con multiples bases de datos.