Le Modèle Todo
L'étape suivante consiste à s'occuper de la base de données. Par défaut, chaque nouveau projet dans FoalTS est configuré pour utiliser une base de données SQLite
car elle ne nécessite aucune installation supplémentaire.
Commençons par créer votre premier modèle. Le CLI fournit une commande utile pour générer un nouveau fichier avec un modèle vide.
foal generate entity todo
FoalTS utilise TypeORM comme ORM par défaut dans toute nouvelle application. De cette façon, vous n'avez rien à configurer et vous pouvez démarrer un projet rapidement. Toutefois, si vous le souhaitez, vous pouvez toujours choisir d'en utiliser un autre (Prisma, MikroORM, Mongoose, etc), le code du framework étant indépendant de l'ORM.
Ouvrez le fichier todo.entity.ts
dans le répertoire src/app/entities
et ajoutez une colonne text
.
import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Todo extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
text: string;
}
Cette classe est la représentation de la table SQL todo
. Actuellement, cette table n'existe pas dans la base de données. Vous allez devoir la créer.
Vous pouvez le faire manuellement, en utilisant un logiciel de base de données par exemple, ou utiliser les migrations, une façon programmatique de mettre à jour un schéma de base de données. L'avantage de l'utilisation des migrations est que vous pouvez créer, mettre à jour et supprimer vos tables directement à partir de la définition de vos entités. Elles permettent également de s'assurer que tous vos environnements (prod, dev) et vos co-développeurs ont les mêmes définitions de tables.
Voyons comment les utiliser.
Exécutez d’abord la commande suivante pour générer votre fichier de migration. TypeORM va comparer votre schéma de base de données actuel avec la définition de vos entités et générer les requêtes SQL appropriées.
npm run makemigrations
Un nouveau fichier apparaît dans le répertoire src/migrations/
. Ouvrez-le.
import {MigrationInterface, QueryRunner} from "typeorm";
export class migration1562755564200 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TABLE "todo" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "text" varchar NOT NULL)`, undefined);
await queryRunner.query(`CREATE TABLE "user" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL)`, undefined);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE "user"`, undefined);
await queryRunner.query(`DROP TABLE "todo"`, undefined);
}
}
La méthode up
contient toutes les requêtes SQL qui seront exécutées pendant la migration.
Exécutez ensuite la migration.
npm run migrations
TypeORM examine toutes les migrations qui ont été exécutées précédemment (aucune dans ce cas) et exécute les nouvelles.
Votre base de données (db.sqlite3
) contient maintenant une nouvelle table nommée todo
:
+------------+-----------+-------------------------------------+
| todo |
+------------+-----------+-------------------------------------+
| id | integer | PRIMARY KEY AUTO_INCREMENT NOT NULL |
| text | varchar | NOT NULL |
+------------+-----------+-------------------------------------+
Vous pouvez également utiliser l'option
database.synchronize
dans votre fichier de configurationconfig/default.json
. Lorsque cette option est définie surtrue
, le schéma de la base de données est automatiquement créé à partir de la définition des entités à chaque lancement de l'application. Vous n'avez pas besoin de migrations dans ce cas. Cependant, bien que ce comportement puisse être utile pendant le débogage et le développement, il n'est pas adapté à un environnement de production (vous pourriez perdre des données de production).