Node
Javascript
typeOrm
REST
APIs
Express
BORRAR: https://medium.com/@odnanref.a8/breve-tutorial-de-express-js-typeorm-revisado-caa59731e4ea
TypeORM es un Object-Relational Mapper / Mapping-tool, o un ORM, es decir una librería que los desarrolladores utilizan para crear bases de datos y manipular sus datos sin la necesidad de conocer / usar SQL.
Los ORM han ganado popularidad debido a que lidiar con el lenguaje SQL directamente requiere de mucho esfuerzo en la mayoría de los casos. El objetivo del ORM entonces es simplificar la mantención de tus datos.
Básicamente, con un ORM no tendrás que escribir SQL otra vez (95% del tiempo) y podrás trabajar con objetos.
Para insertar un usuario con SQL tienes que escribir:
1INSERT INTO user (name, last_name) VALUES ('Juan', 'McDonals');
Con un ORM tu código sigue siendo un código familiar como este:
1user = User() 2user.name = 'Juan' 3user.last_name = 'McDonals' 4 5# agrega el user a la base de datos 6user.save(); 7
Basta con que digas: user.save()
y todo lo que hayas hecho con tu código se traducirá a código de lenguaje SQL.
TypeOrm utiliza el patrón de diseño llamado decorador para modificar el comportamiento de una clase. Estos decoradores nos sirven para definir los elementos de un modelo, como crear una columna, definir si tiene una llave primaria,etc.
Para construir nuestro modelo utilizaremos los siguientes decoradores que nos proporciona typeOrm.
@Entity()
: Al usar este decorador, se crea una clase que asigna a una tabla de base de datos.
@PrimaryGeneratedColumn()
:Indica que la columna es Primary Key y que su valor debe ser autoincrementado. Es posible pasarle un parámetro (‘uuid’) que hace que los valores de esta columna sean cadenas de texto aleatorios en lugar de números enteros secuenciales.
@Column()
: Una columna común y corriente de la base de datos. Podemos especificar varios parámetros como el tipo (varchar, int, tinyint, decimal), si es obligatoria (nullable: true | false), la longitud máxima (length: int) y muchas cosas más.
Ver Documentación
@CreateDateColumn() y @UpdateDateColumn()
: Son decoradores especiales que indican que el valor de estas columnas se asigna automáticamente al crear un nuevo registro o al actualizar uno ya existente respectivamente.
El primer paso sería definir nuestro modelo
1@Entity() 2export class Users extends BaseEntity{ 3 @PrimaryGeneratedColumn() 4 id: number; 5 6 @Column() 7 first_name: string; 8 9 @Column() 10 last_name: string; 11 12 @Column({unique: true}) 13 email: string; 14 15 @Column() 16 password: string; 17 18}
1 2 const usersRepo = getRepository(User); 3 const user = usersRepo.create(req.body as ObjectLiteral); //Creo un usuario 4 5 const result = await usersRepo.save(user); //Grabo el nuevo usuario 6
Hay 3 formas para devolver data de la base de datos:
1. Buscar/Recuperar/Devolver todo los registros desde un Table/Model en particular usando getRepository(MyModel).find()
2. Buscar/Recuperar/Devolver un solo registro basado en su primary key usando getRepository(MyModel).findOne()
3. Buscar/Recuperar/Devolver un grupo de registro basado en su consulta Person.query.filter_by(arg1=value, arg2=value, ...)
1# aqui es como se buscan todas las personas 2const users = await getRepository(Users).find(); 3 4# aqui es como se busca un grupo de personas con name = alex 5const users = await getRepository(Users).find("first_name":"alex"); 6 7# aquí es cómo se busca a una persona con id = 3 (solo funciona con las primary key) 8user = Users.query.get(3) 9const user = await getRepository(Users).findOne(req.params.id:"3");
Todo lo que tiene que hacer es crear un nuevo objeto Person, agregarlo a la sesión de la base de datos y ¡commit!
1const users = await getRepository(Users).delete(ID_USER); 2
Para actualizar, primero necesitas devolver/seleccionar el registro de la base de datos, luego puedes actualizar la propiedad que desees y hacer commit nuevamente.
1 const user = await getRepository(Users).findOne(req.params.id); //Busco el usuario en la tabla por el ID recibido 2 getRepository(Users).merge(user, req.body); // Hace un merge de los datos existentes con los que se reciben a través de body 3 const results = await getRepository(Users).save(user); // Almacena el cambio en la base de datos
En ingles one-to-one se utiliza el decorador @OneToOne
,es una relación en la que A contiene una instancia de B y B contiene una instancias de A.
En ingles many-to-one se utiliza el decorador @ManyToOne
En ingles one-to-many se utiliza el decorador @OneToMany
En ingles Many-to-many se utiliza el decorador @ManyToMany
,es una relación en la que A contiene varias instancias de B y B contiene varias instancias de A.
Un ejemplo es la relación existente entre una entidades Pregunta con otra Categoría. Una pregunta puede tener varias categorías y cada categoría puede tener varias preguntas.
1import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; 2 3@Entity() 4export class Category { 5 6 @PrimaryGeneratedColumn() 7 id: number; 8 9 @Column() 10 name: string; 11 12} 13 14@Entity() 15export class Question { 16 17 @PrimaryGeneratedColumn() 18 id: number; 19 20 @Column() 21 title: string; 22 23 @Column() 24 text: string; 25 26 @ManyToMany(() => Category) 27 @JoinTable() 28 categories: Category[]; 29 30}
@JoinTable()
se utiliza para definir la entidad propietaria en la relación. Ene ste ejemplo se debe utilizar el decorador @ManyToMany
.
@ManyToMany
: a continuación veremos une ejemplo donde se crean las instancias de las categorías y luego se asignan como un array a la entidad Question
1const category1 = new Category(); 2category1.name = "animals"; 3await connection.manager.save(category1); 4 5const category2 = new Category(); 6category2.name = "zoo"; 7await connection.manager.save(category2); 8 9const question = new Question(); 10question.title = "dogs"; 11question.text = "who let the dogs out?"; 12question.categories = [category1, category2]; 13await connection.manager.save(question);
@ManyToMany
:Con las cascadas habilitadas, puede eliminar esta relación con solo una llamada de guardado. Para eliminar una relación de varios a varios entre dos registros, elimínela del campo correspondiente y guarde el registro.
1const question = getRepository(Question); 2question.categories = question.categories.filter(category => { 3 category.id !== categoryToRemove.id 4}) 5await connection.manager.save(question)
Hemos preparado este ejemplo de codificación en vivo que puede ejecutar tu mismo en Gitpod y utilizarlo como base para su proyecto.
Expressjs Rest Hello: https://github.com/4GeeksAcademy/expressjs-rest-hello