By Sails.js Tech Brasil


Sails com Sequelize

Sequelize é uma ferramenta ORM baseada em Promisses Node.js para Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server, Oracle Database, Amazon Redshift e Data Cloud da Snowflake.

Ele possui suporte sólido a transações, relações, replicação de leitura e muito mais.

Escolhemos o Oracle XE como database do nosso exemplo em função da sua popularidade e especificidade, mas todos os exemplos abaixo servem para qualquer um dos bancos de dados listados acima.

Se esta é sua primeira vez aqui, recomendamos a leitura dos conteúdos abaixo antes de continuar:


Passo a passo para instalação e primeiro protótipo
  1. Instale o Oracle XE na sua estação (obrigatório, mesmo que o banco a ser acessado seja remoto!)
  2. Localize / Recupere os dados de conexão com o DB Oracle XE instalado (ou já existente)
  3. Depois conecte no Database com uma ferramenta de sua escolha (recomendo o Oracle SQL Developer) e crie uma tabela 'TESTANDO' com o seguinte comando:
    
    CREATE TABLE TESTANDO (ID NUMBER PRIMARY KEY, TX_DESCRICAO VARCHAR2(30), VALOR NUMBER(2), DT_INSERT DATE, DT_UPDATE DATE); COMMIT;
    
                    
  4. Inclua um ou mais registros com o comando:
    INSERT INTO TESTANDO VALUES (1, 'PRIMEIRO TESTE', 42, SYSDATE, SYSDATE);
    COMMIT;
                
  5. Verifique se os seus dados foram adicionados a base de dados com o comando:
    SELECT * FROM TESTANDO;
                
  6. Instale a biblioteca Sequelize com o comando npm i sequelize --save
  7. Instale a biblioteca Sequelize/Oracle com o comando npm i sequelize-oracle --save
  8. Instale a biblioteca Oracle DB com o comando npm i oracledb --save
  9. Na console do terminal e no diretório raíz de seu protótipo Sails.js, digite sails generate helper sequelize-oracle-connection
  10. Você deve ver na console algo do tipo:
     Successfully generated:
     •- api/helpers/sequelize-oracle-connection.js
    
    A few reminders:
     (1)  To call this helper:
    
              // With default usage:
              await sails.helpers.sequelizeOracleConnection(…, …);
    
              // With named parameters:
              await sails.helpers.sequelizeOracleConnection.with({
                someInput: …,
                someOtherInput: …
              });
    
     (2)  You can read more about helpers in the Sails documentation.
            [?] https://sailsjs.com/docs/concepts/helpers
                    
  11. Localize o arquivo acima e faça a edição para ter o seguinte conteúdo:
    module.exports = {
    
    
      friendlyName: 'Sequelize oracle connection',
    
    
      description: '',
    
    
      inputs: {
    
      },
    
    
      exits: {
    
        success: {
          description: 'All done.',
        },
    
      },
    
    
      fn: async function (inputs) {
        const Sequelize = require('sequelize');
        return new Sequelize('oracle://username:password@oracle-server:port/service');
      }
    
    
    };
                    
  12. Substitua as informações de username, password, oracle-server, port e service pelos dados de conexão obtidos na instalação do Oracle do passo 2
  13. Precisamos criar o Modelo para o relacionamento ORM que será utilizado, ou seja, o Sequelize necessita saber como manipular os campos da tabela associada. Para isso:
    • Atenção! Não utilize o comando sails generate model testando, nem crie o arquivo na pasta / diretório api/models.
    • Crie um diretório / subpasta abaixo de api chamado 'schema' e depois o arquivo Testando.js (api/schema/Testando.js)
    • Adicione ao arquivo criado o seguinte conteúdo:
      /**
       * Retorna um Objeto Testando obtido da
      * camada de persistencia passada como parametro * * * @return Testando ORM */ const Sequelize = require('sequelize'); module.exports = function (sequelize) { return sequelize.define('Testando', { id: { type: Sequelize.STRING, field: 'ID', primaryKey: true }, descricao: { type: Sequelize.STRING, field: 'TX_DESCRICAO' }, createdAt: { type: Sequelize.DATE, field: 'DT_INSERT' }, updatedAt: { type: Sequelize.DATE, field: 'DT_UPDATE' } }, { tableName: 'TESTANDO', schema: '' // SOMENTE SE O ESQUEMA FOR DIFERENTE DO NOME DO USUARIO LOGADO }); };
  14. Na console do terminal e no diretório raíz de seu protótipo Sails.js, digite sails generate action testando. Você verá no console:
    
    Successfully generated:
     •- api/controllers/get-testando.js
    
    A few reminders:
     (1)  For most projects, you'll need to manually configure an explicit route
          in your `config/routes.js` file; e.g.
              'GET /api/v1/get-testando': { action: 'get-testando' },
    
     (2)  If you are using the built-in JavaScript SDK ("Cloud") for AJAX requests
          from client-side code, then after configuring a new route, you'll want to
          regenerate the SDK setup file using:
              sails run rebuild-cloud-sdk
    
     (3)  This new action was generated in the "actions2" format.
            [?] https://sailsjs.com/docs/concepts/actions
    
     (4)  Last but not least, since adding an action or route is a backend change,
          don't forget to re-lift the server before testing!
                    
  15. Execute a recomendação (1) e adicione 'GET /api/v1/get-testando': { action: 'get-testando' }, ao arquivo config/routes.js
  16. Localize o arquivo config/policies.js e adicione a linha 'get-testando': true, para permitir o acesso a rota /api/v1/get-testando sem a necessidade de autenticação
  17. Abra o arquivo api/controllers/get-testando.js criado acima e modifique para que tenha o seguinte conteúdo:
    module.exports = {
    
    
      friendlyName: 'Testando',
    
    
      description: 'Testando something.',
    
    
      inputs: {
    
      },
    
    
      exits: {
    
      },
    
    
      fn: async function (inputs) {
    
        /* solicita ao core do Sails que obtenha a conexao do helper  */
        let sequelize = await sails.helpers.sequelizeOracleConnection();
        /* carrega o modelo de dados associado a tabela */
        let Testando = require('../schema/Testando')(sequelize);
        /* acessa a base de dados e faz a leitura dos dados armazenados */
        let teste = await Testando.findAll({limit:10});
        /* devolve um objeto de dados para o requisitante (HTTP Request) */
        return {teste};
    
      }
    
    
    
    };
                
  18. Execute seu protótipo com o comando sails lift, depois digite na barra de navegação: http://localhost:1337/api/v1/get-testando
  19. O comportamento esperado é que o navegador apresente os dados inseridos no passo (4), em formato JSON.
    {
        "teste": [
            {
                "id": 1,
                "descricao": "PRIMEIRO TESTE",
                "createdAt": "2023-09-04T20:11:11.000Z",
                "updatedAt": "2023-09-04T20:11:11.000Z"
            }
        ]
    }
                
  20. É possível solicitar que o Array de dados seja devolvido diretamente, se estar empacotado no Objeto teste. Para isso, modifique a linha return {teste} para return teste e a resposta então deverá ser:
    [
        {
            "id": 1,
            "descricao": "PRIMEIRO TESTE",
            "createdAt": "2023-09-04T20:11:11.000Z",
            "updatedAt": "2023-09-04T20:11:11.000Z"
        }
    ]
                
  21. Execute seu protótipo com o comando sails lift, depois digite na barra de navegação: http://localhost:1337/api/v1/get-testando
  22. O comportamento esperado é que o navegador apresente os dados inseridos no passo (4), em formato JSON.
O uso do recurso Helper garante que todo o Backend do seu Protótipo Sails será capaz de se conectar ao banco de dados associado, sem a necessidade de repetição de código.
Observe que:

Este é um exemplo simplificado para demonstrar como acessar uma base de dados utilizado Sequelize associado aos recursos do Sails.js.
Visite o site Sequelize V6 e conheça outras opções de manipulação de dados.


Para saber mais:
Início