Como ler arquivo CSV e salvar no banco de dados com Node.js
Neste tutorial, será apresentado como ler um arquivo CSV e salvar no banco de dados com Node.js.
Primeiramente, será mostrado como ler o conteúdo do arquivo Excel.
Em seguida, será apresentado como salvar no banco de dados as informações do arquivo CSV.
Por fim, será mostrado como bloquear o cadastro duplicado com Node.js.
Baixar o código fonte: Download
Full Stack: Curso de React e Node.js: Mais Detalhes do Curso
Como instalar o MySQL no Windows: Acessar
Como instalar o MySQL Workbench no Windows: Acessar
Como salvar log no Node.js: Acessar
Aulas gratuitas do curso de Node.js: Acessar
Para começar, é criado o arquivo "package.json" executando o comando "npm init" no terminal do editor ou no prompt de comando.
Em seguida, é instalada a dependência Express.
npm install express
Criado o arquivo "app.js" com as rotas raiz utilizando Express, e indicado para rodar o projeto na porta 8080.
// Incluir as bibliotecas
// Gerencia as requisições, rotas e URLs, entre outra funcionalidades
const express = require("express");
// Chamar a função express
const app = express();
// Criar a rota inicial
// Endereço para acessar: http://localhost:8080
app.get("/", (req, res) => {
// Retornar a frase para a aplicação que fez a requisição da rota
res.send("Página inicial.");
});
// Iniciar o servidor na porta 8080, criar a função utilizando modelo Arrow function para retornar a mensagem de sucesso
app.listen(8080, () => {
console.log("Servidor iniciado na porta 8080: http://localhost:8080");
});
Instalada a dependência para ler CSV.
npm install csv
Incluída a dependência no arquivo 'app.js', também o módulo 'fs' para interagir com o sistema de arquivos.
// Incluir a biblioteca para ler o conteúdo do arquivo CSV
const csv = require('csv');
// Permite interagir com o sistema de arquivos
const fs = require('fs');
Na rota raiz, primeiro é indicado qual arquivo CSV deve ser utilizado; em seguida, é realizada a leitura e o resultado da leitura do arquivo CSV é impresso no terminal.
// Caminho para o arquivo CSV
const arquivoCSV = 'arquivo.csv';
// Ler o arquivo CSV
fs.createReadStream(arquivoCSV)
// pipe - conectar fluxos de leitura e escrita, sem armazenar os dados intermediários em memória
// columns: true - Primeira linha do arquivo CSV seja tratada como cabeçalho, o nome do cabeçalho corresponde o nome da coluna no banco de dados
// Delimitador é ; (ponto e vírgula)
.pipe(csv.parse({ columns: true, delimiter: ';' }))
// Acionar o evento data quando ler uma linha e executar a função enviando os dados como parâmetro
.on('data', async (dadosLinha) => {
console.log(dadosLinha);
});
return res.send("Importação concluída.");
O próximo passo é salvar no banco de dados. Para isso, é necessário ter o banco de dados instalado na máquina. Caso não tenha, utilize como base o tutorial 'Como instalar o MySQL no Windows'. Por fim, crie a base de dados 'celke'.
CREATE DATABASE celke CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Para conectar o Node.js com o banco de dados MySQL, será utilizado o Sequelize. Para instalá-lo, é utilizado o comando:
npm install --save sequelize
Também instalado o driver do banco de dados MySQL.
npm install --save mysql2
Junto instalado o Sequelize-cli, que permite usar linha de comando para criar modelos, configurações e arquivos de migração para bancos de dados.
npm install --save-dev sequelize-cli
O primeiro comando a ser executado com Sequelize-cli é criar o arquivo de configuração no diretório de models, migrations, seeders e conexão com banco de dados.
npx sequelize-cli init
Em seguida, é criado o arquivo .sequelizerc responsável por indicar onde estão as models, migrations e seeders.
// Fornece utilitários para trabalhar com caminhos de arquivos e diretórios
const path = require('path');
// Exportar o caminho da conexão com banco de dados, models, seeders e migrations
module.exports = {
'config': path.resolve('db', 'config', 'config.js'),
'models-path': path.resolve('db', 'models'),
'seeders-path': path.resolve('db', 'seeders'),
'migrations-path': path.resolve('db', 'migrations')
}
Para armazenar as credenciais do banco de dados, serão utilizadas variáveis de ambiente. Para gerenciar essas variáveis, será utilizado o Dotenv. Primeiramente, a dependência é instalada.
npm install --save dotenv
Foi criado o arquivo '.env' com as variáveis de ambiente.
TZ=America/Sao_Paulo # Fuso horário utilizado no projeto
NODE_ENV=development # Ambiente do projeto
DB_HOST=localhost # Local do banco de dados
DB_BASE=celke # Base de dados
DB_USER=root # Usuário do banco de dados
DB_PASS= # Senha do banco de dados
DB_DIALECT=mysql # Tipo do banco de dados
Utilizadas as variáveis de ambiente no arquivo 'db/config/config.js', responsável por indicar os tipos de ambiente.
// Incluir o arquivo com as variáveis de ambiente
require('dotenv').config();
// Exportar as credenciais do banco de dados
module.exports = {
"development": {
"username": process.env.DB_USER,
"password": process.env.DB_PASS,
"database": process.env.DB_BASE,
"host": process.env.DB_HOST,
"dialect": process.env.DB_DIALECT
},
"test": {
"username": process.env.DB_USER,
"password": process.env.DB_PASS,
"database": process.env.DB_BASE,
"host": process.env.DB_HOST,
"dialect": process.env.DB_DIALECT
},
"production": {
"username": process.env.DB_USER,
"password": process.env.DB_PASS,
"database": process.env.DB_BASE,
"host": process.env.DB_HOST,
"dialect": process.env.DB_DIALECT
}
}
No arquivo 'db/models/index.js', que possui a conexão com o banco de dados, foi alterado o arquivo responsável por indicar os tipos de ambiente.
const config = require(__dirname + '/../config/config.js')[env];
Também acrescentado o código para verificar se conseguiu realizar a conexão com o banco de dados.
// Verificar a conexão com banco de dados
sequelize.authenticate()
.then(() => {
console.log("Conexão com o banco de dados realizado com sucesso!");
}).catch((error) => {
console.log("Erro: Conexão com o banco de dados não realizado com sucesso!", error);
});
Em seguida, foi criada a migration. No tutorial 'O que é migrations e como usar migrations com Node.js,' apresento mais detalhes sobre por que usar migrações e como usá-las.
npx sequelize-cli model:generate --name Users --attributes cpf:string,nome:string,email:string,endereco:string
Ao executar o código acima, será criada a migration "db/migrations/data_nome_migration".
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
cpf: {
type: Sequelize.STRING
},
nome: {
type: Sequelize.STRING
},
email: {
type: Sequelize.STRING
},
endereco: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
async down(queryInterface, Sequelize) {
await queryInterface.dropTable('Users');
}
};
O próximo passo é executar a migração para criar a tabela no banco de dados.
npx sequelize-cli db:migrate
Com a conexão do Node.js com o banco de dados MySQL realizada e a tabela criada utilizando a migração, na rota raiz do arquivo 'app.js', pode ser implementado o código para salvar o registro do CSV no banco de dados, importante incluir a conexão com banco de dados.
// Incluir a conexão com banco de dados
const db = require('./db/models');
// Cadastrar o usuário no banco de dados
await db.Users.create(dadosLinha);
Para cadastrar no banco de dados, é somente isso? Sim, mas pode ser acrescentada a restrição de cadastrar um único registro por CPF, verificando se o CPF já está cadastrado no banco de dados.
// Recuperar o registro do banco de dados
const user = await db.Users.findOne({
// Indicar quais colunas recuperar
attributes: ['id'],
// Acrescentado condição para indicar qual registro deve ser retornado do banco de dados
where: { cpf: dadosLinha.cpf }
});
// Acessa o IF quando o usuário não está cadastrado no banco de dados
if (!user) {
// Cadastrar o usuário no banco de dados
await db.Users.create(dadosLinha);
}
Baixar o código-fonte completo do projeto.
Bom, era isso. Espero que o tutorial tenha sido útil!