Sequelize ORM, come utilizzare le migrazioni con un database SQLite

Le migrazioni sono utili per tenere traccia delle modifiche al database, Sequelize offre uno strumento a linea di comando per utilizzare al meglio le migrazioni del proprio database.

Pubblicato da ,
Ultima modifica

Sequelize è un Object-Relational Mapping TypeScript e NodeJS, supporta Oracle, Postgres, MySQL, MariaDB, SQLite e SQL Server e altro ancora, in questo articolo vedremo come eseguire delle migrazioni per un database SQLite.

Se non abbiamo già un progetto inizializzato con npm, allora la prima cosa da fare è lanciare il seguente comando da CLI nella cartella dove vogliamo creare
il nostro progetto

$ npm init

ci verranno chieste una serie di informazioni come il nome del pacchetto, la descrizione, etc..., se vogliamo saltare la procedura per inserire queste informazioni possiamo usare il comando

$ npm init -y

al termine verrà generato nella root un file package.json simile a questo

package.json

{
  "name": "Sequelize",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Adesso che abbiamo il progetto pronto possiamo installare Sequelize col seguente comando

$ npm install --save sequelize

e installare successivamente il driver per il nostro database preferito, in questo esempio è sqlite3, quindi usiamo il comando seguente

$ npm install --save sqlite3

Per poter utilizzare le migrazioni dobbiamo installare lo strumento a linea di comando sequelize-cli , quindi da CLI eseguiamo il comando

$ npm install --save-dev sequelize-cli

se l'installazione è andata a buon fine, lanciamo il comando sequelize --help da CLI e avremo un risultato simile a questo

$ node_modules/sequelize-cli/lib/sequelize --help                                        
                                                           
Sequelize CLI [Node: 14.16.1, CLI: 6.4.1, ORM: 6.34.0]  

................
................

per sapere quali sono tutti i comandi disponibili consultare il seguente link

github.com/sequelize/cli#usage

adesso che abbiamo installato sequelize-cli lanciamo il comando per inizializzare il nostro progetto

$ node_modules/sequelize-cli/lib/sequelize init

verranno generate le seguenti cartelle e file nella root del progetto

  • config/
    • config.json
  • migrations/
  • models/
  • seeders/

config contiene il file config.json che è il file di configurazione che indica alla CLI come connettersi al database, models contiene tutti i modelli del progetto, migrations contiene tutti i file di migrazione, seeders contiene tutti i file seeder, in questo articolo non tratteremo l'argomento dei seeders.

Il config.json è simile a questo

config.json

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

di default viene usato mysql e development come dati di connessione al database.

Adesso creiamo un database test.db usando il comando sqlite3, quindi da CLI lanciamo il comando

$ sqlite3 test.db

dopo aver lanciato questo comando entreremo nella shell sqlite, per verificare che il database è stato creato lanciamo il comando .databases, avremo un risultato simile a questo

$ sqlite3 test.db                                             
SQLite version 3.19.1 2017-05-24 13:08:33                     
Enter ".help" for usage hints.                                
sqlite> .databases                                            
main: \path\test.db

in particolare verrà creato un file test.db nella root del nostro progetto.

Adesso andiamo a modificare il file config.json affinchè venga utilizzato il database test.db

config.json

{
  "development": {
    "dialect": "sqlite",
    "storage": "test.db"
  },
........................
........................
........................
........................
}

Creaiamo adesso la nostra prima migrazione che automaticamente genererà anche il modello, in questo esempio creiamo un modello User

node_modules/sequelize-cli/lib/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string

questo comando indica che la tabella Users sarà costituita dalle colonne firstName, lastName e email di tipo stringa, in particolare sequelize-cli genera automaticamente anche le colonne id, createdAt e updatedAt rispettivamente l'id univoco per ogni user inserito, la data di creazione e la data di aggiornamento, il risultato di questo comando è la creazione di tre file

  • migrations/
    • 20231104133001-create-user.js
  • models/
    • index.js
    • user.js

adesso eseguiamo la migrazione utilizzando il comando

node_modules/sequelize-cli/lib/sequelize db:migrate

se tutto è andato a buon fine vedremo che nel database test.db è stata creata una tabella Users, possiamo notare che è stata creata anche una tabella SequelizeMeta, questa tabella viene utilizzata per registrare quali migrazioni sono state eseguite nel database corrente.

Infine vorrei mostrare come utilizzare Sequelize per inserire dati nella tabella Users appena creata.

Craiamo un file test.js nel quale specifichiamo la connessione al database SQLite e inseriamo dei dati nella tabella Users

test.js

const { Sequelize } = require('sequelize');
const User = require('./models').User;

const sequelize = new Sequelize({
  dialect: 'sqlite',
  storage: 'test.db'
});

const user = User.create({ firstName: "Michele", lastName: "De Falco", email:"test@mail.it" });

ora dalla CLI eseguiamo questo file col seguente comando

node test.js

se tutto va a buon fine vedremo i dati inseriti nella tabella Users del database test.db.

Come detto in precedenza di default viene usata la configurazione development nel file config.js, se vogliamo usare un'altra configurazione, bisogna modificare il valore env nel file /models/index.js

..............
..............

const env = process.env.NODE_ENV || 'development';

..............
..............

Se si utilizza Visual Studio Code come IDE preferito, è possibile aprire il database test.db per visualizzare i dati installando l'estensione SQLite.