A sequelize-cli será utilizada para gerarmos alguns boilerplates através de comandos do terminal e executar tarefas como criar o banco de dados, rodar migrations, rodar seeders, etc.
- Para configurar as opções da sequelize-cli, crie uma pasta config na raiz do projeto e o arquivo sequelizeCli.js dentro dela:
- Obs.: A sequelize-cli precisa de acesso ao banco de dados para rodar a parte do nosso app, por isso temos que configurá-la separadamente (depois faremos uma configuração semelhante para nosso próprio app).
- Obs².: Como estamos utilizando um arquivo js para essas configurações esses valores poderiam ser obtidos através de variáveis de ambiente, mas no momento não faremos isso (para simplificar).
// config/sequelizeCli.js
module.exports = {
development: {
dialect: 'postgres',
host: 'localhost',
port: '5432',
database: 'onebitflix_development',
username: 'onebitflix',
password: 'onebitflix'
}
}
- Na raiz do projeto crie o arquivo .sequelizerc:
- Obs.: Esse arquivo é muito importante. Como estamos fazendo nossa própria estrutura precisamos “dizer” para a sequelize-cli que queremos que ela procure/gere arquivos nesses caminhos específicos. Por padrão esses caminhos seriam outros.
// .sequelizerc
const path = require('path');
module.exports = {
'config': path.resolve('config', 'sequelizeCli.js'),
'models-path': path.resolve('src', 'models'),
'seeders-path': path.resolve('src', 'database', 'seeders'),
'migrations-path': path.resolve('src', 'database', 'migrations')
};
- Caso ainda não possua um usuário no PostgreSQL, crie um com a permissão CREATEDB:
sudo -u postgres psql
CREATE USER onebitflix WITH CREATEDB ENCRYPTED PASSWORD 'onebitflix';
- Agora já será possível utilizar a sequelize-cli para criar o banco de dados:
npx sequelize-cli db:create
- Crie as pastas necessárias conforme especificamos no arquivo .sequelizerc:
mkdir src/models src/database src/database/migrations
src/database/seeders
- Por fim, crie o arquivo de conexão com o banco de dados em um arquivo index.ts na pasta src/database:
- Obs.: Agora sim, a conexão que será usada pela nossa aplicação. Mais uma vez, o ideal seria não ter nenhuma senha exposta aqui no código, e sim através de variáveis de ambiente. Mas faremos isso posteriormente (para simplificar).
- Obs².: Aqui é legal destacar que o underscored é bem importante. Ele serve para que o sequelize converta automaticamente os nomes das colunas de snake_case (convenção no SQL) para camelCase (convenção no Javascript), assim referenciaremos nossas tabelas (no BD) usando snake_case e nossos models (no app) usando camelCase.
// src/database/index.ts
import { Sequelize } from 'sequelize'
export const database = new Sequelize({
dialect: 'postgres',
host: 'localhost',
port: 5432,
database: 'onebitflix_development',
username: 'onebitflix',
password: 'onebitflix',
define: {
underscored: true
}
})
- É possível testar a conexão atualizando o arquivo server.ts dessa forma:
- Obs.: O método authenticate() só serve para executar uma query 1 + 1 de teste e ver se a conexão funciona.
// src/server.ts
import express from 'express'
import { database } from './database'
const app = express()
const PORT = process.env.port || 3000
app.listen(PORT, () => {
database.authenticate().then(() => {
console.log('DB connection successfull.')
})
console.log(`Server started successfuly at port ${PORT}.`)
})