ORM JavaScript : décorateurs

J'ai commencé à travailler avec un ORM pendant un stage. La stack backend devait être conçue en Java et dès mon arrivé dans l'entreprise, on m'a demandé de travailler avec l'ORM Hibernate. Même si Hibernate en tant que tel me pose pas mal de problèmes, j'apprécie énormément pouvoir utiliser les décorateurs pour définir les rapports entre mon objet et la table qui lui est associée.

Venant du monde Node.js et réalisant la totalité de mes projets personnels avec un backend Node.js, j'ai donc cherché un ORM pour Node.js, qui supporte les promesses (simple question de confort) et qui utilise les décorateurs.

Les principaux ORMs Node.js, actuellement, sont Sequelize et Bookshelf.js. Malheureusement, ceux-ci n'utilisent pas :

  • Les promesses natives (ES6), mais des promesses Bluebird
  • Les classes pour définir les entitées (ES6)
  • Les décorateurs (ES7)

Finalement, je finis par tomber sur TypeORM. TypeORM est un ORM qui peut être utilisé en TypeScript mais surtout (c'est ce qui m'intéresse ici), en utilisant le standard ES7 (qui supporte les décorateurs, vous suivez ?).

C'est un ORM très complet, voici une petite liste des fonctionnalités qui me semblent les plus intéressantes :

  • Support de MySQL, MariaDB, Postgres, SQLite, Microsoft SQL Server, Oracle, WebSQL
  • Support de MongoDB
  • Fonctionne côté browser et sur les applications Cordova
  • Log efficace (un bonheur à debugger en comparaison avec Hibernate)
  • Supporte l'héritage des entités
  • Active Record ou Data Mapper
  • Système de subscriber

Un exemple d'utilisation, directement importé du dépôt officiel de TypeORM :

import { 
    Entity,
    PrimaryGeneratedColumn,
    Column,
    BaseEntity
} from 'typeorm'

@Entity()
export class User extends BaseEntity {
    @PrimaryGeneratedColumn()
    id
    
    @Column()
    firstName
    
    @Column()
    lastName

    @Column()
    age
}
const user = new User()
user.firstName = 'Timber'
user.lastName = 'Saw'
user.age = 25
await user.save()

Une excellente découverte, qui malgré tout m'oblige à une chose : développer en ES7 sur un engine (Node 9) qui ne supporte pas l'ES7.

Pour pallier à ce problème, j'exécute mon script à l'aide de Babel.js, de cette manière :

babel-node SCRIPT.js --presets env --plugins transform-decorators-legacy,transform-class-properties

C'en est terminé pour cette présentation de TypeORM. N'hésitez pas à partager l'article (à des dévs, pas à votre grand-mère) si vous l'avez apprécié et à le commenter en cas de questions ou de remarques !

Xavier Stouder

Read more posts by this author.