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.