Node com Sequelize - resolvido

Tenho este arquivo 20190619010000-create-sistema_usuario.js

'use strict';

module.exports = {

  up: (queryInterface, Sequelize) => {

    return queryInterface.createTable('sistema_usuario', {

      cd_usuario: {

        allowNull: false,

        autoIncrement: true,

        primaryKey: true,

        type: Sequelize.INTEGER

      },

      nome: {

        allowNull: false,

        type: Sequelize.STRING(100)

      },

      cpf: {

        allowNull: false,

        type: Sequelize.STRING(11)

      },

      telefone: {

        allowNull: false,

        type: Sequelize.STRING(15)

      },

      email: {

        allowNull: false,

        type: Sequelize.STRING(150)

      },

      senha: {

        allowNull: false,

        type: Sequelize.STRING(50)

      },

      cd_perfil: {

        allowNull: false,

        type: Sequelize.SMALLINT

      },

      cd_sistema: {

        allowNull: false,

        type: Sequelize.SMALLINT

      },

      idc_status: {

        allowNull: false,

        type: Sequelize.SMALLINT

      },

      createdAt: {

        allowNull: false,

        type: Sequelize.DATE

      },

      updatedAt: {

        allowNull: false,

        type: Sequelize.DATE

      }

    });

  },

  down: (queryInterface, Sequelize) => {

    return queryInterface.dropTable('sistema_usuario');

  }

};

com este model:

'use strict';

module.exports = (sequelize, Sequelize) => {

  const SistemaUsuario = sequelize.define('SistemaUsuario', {

    cd_usuario: {

      allowNull: false,

      autoIncrement: true,

      primaryKey: true,

      type: Sequelize.INTEGER

    },

    nome: {

      allowNull: false,

      type: Sequelize.STRING(100)

    },

    cpf: {

      allowNull: false,

      type: Sequelize.STRING(11)

    },

    telefone: {

      allowNull: false,

      type: Sequelize.STRING(15)

    },

    email: {

      allowNull: false,

      type: Sequelize.STRING(150)

    },

    senha: {

      allowNull: true,

      type: Sequelize.STRING(50)

    },

    cd_perfil: {

      allowNull: false,

      type: Sequelize.SMALLINT

    },

    cd_sistema: {

      allowNull: false,

      type: Sequelize.SMALLINT

    },

    idc_status: { // 1: Ativo, 2: Inativo

      allowNull: false,

      type: Sequelize.SMALLINT

    }

  }, {

    tableName: 'sistema_usuario',

    getterMethods: {

      status_desc: function() {

        switch (this.idc_status){

          case 1:

            return 'Ativo';

          case 2:

            return 'Inativo';

          default:

            return null;

        }

      }

    }

  });

  SistemaUsuario.associate = function (models) {

    SistemaUsuario.belongsTo(models.SistemaPerfilAcesso, { foreignKey: 'cd_perfil', as: 'perfil'} );

    SistemaUsuario.belongsTo(models.Sistema, { foreignKey: 'cd_sistema', as: 'sistema'} );

    SistemaUsuario.hasOne(models.PontoApoioUsuario, { foreignKey: 'cd_usuario', as: 'ponto_apoio_usuario'} );

  };

  SistemaUsuario.removeAttribute('id');

  return SistemaUsuario;

};

No banco de dados tem uma tabela com o nome SequelizeMeta. Nesta tabela tem todos os arquivos que estão na pasta db/migrations.

CREATE TABLE public."SequelizeMeta" (
  name VARCHAR(255) NOT NULL,
  CONSTRAINT "SequelizeMeta_pkey" PRIMARY KEY(name)
) 
WITH (oids = false);

ALTER TABLE public."SequelizeMeta"
  OWNER TO postgres;

Preciso aumentar o tamanho do campo da senha para 255 de forma automática, como fazer ?

Sou novo com node.js

Parece com o flyway.

A proposta é sempre alterar o banco de dados através de migrations, ou seja, pequenos scripts que serão executados quando a aplicação for executada.

No seu caso, vc teria que criar um novo script dentro de db/migrations com a alteração que precisa ser feita.

Se for parecido com o Flyway, o script já será reconhecido, executado e um novo registro será gravado na tabela de controle, que no seu caso é a SequelizeMeta.

Nunca usei o sequelize, mas essa parte de migrations deve ser a mesma ideia do Flyway e Liquibase.

1 curtida

Fiz assim e com este nome 20210721163100-update-sistema_usuario.js, mas não funcionou.

"use strict";

module.exports = {

  up: (queryInterface, Sequelize) => {

    return Promise.all([

      queryInterface.changeColumn(

        "sistema_usuario ",

        "senha",

        {

          allowNull: false,

          type: Sequelize.STRING(255),

        },

        {

          transaction,

        }

      ),

    ]);

  },

  down: (queryInterface, Sequelize) => {

    return Promise.all([

      queryInterface.changeColumn(

        "sistema_usuario",

        "senha",

        {

          allowNull: false,

          type: Sequelize.STRING(255),

        },

        {

          transaction,

        }

      ),

    ]);

  },

};

Quando executa dá algum erro?

Obs.: vc soh precisa usar o Promise.all quando for executar mais de uma operação assíncrona. Como é apenas um changeColumn, vc pode dá o return direto.

1 curtida

Eu digito npm install e não mostra erro no console.

Fiz assim agora

"use strict";

module.exports = {

  up: (queryInterface, Sequelize) => {

    return queryInterface.changeColumn(

      "sistema_usuario ",

      "senha",

      {

        allowNull: false,

        type: Sequelize.STRING(255),

      },

      {

        transaction,

      }

    );

  },

  down: (queryInterface, Sequelize) => {

    return queryInterface.changeColumn(

      "sistema_usuario",

      "senha",

      {

        allowNull: false,

        type: Sequelize.STRING(255),

      },

      {

        transaction,

      }

    );

  },

};

e continua sem erros.

Tem que dar outro comando ?

De acordo com: https://sequelize.org/master/manual/migrations.html

Tem que executar:

npx sequelize-cli db:migrate
2 curtidas

Valeu demais

Só que tiver que adptar

"use strict";

module.exports = {

  up: (queryInterface, Sequelize) => {

    return queryInterface.changeColumn("sistema_usuario", "senha", {

      allowNull: false,

      type: Sequelize.STRING(255),

    });

  },

  down: (queryInterface, Sequelize) => {

    return queryInterface.changeColumn("sistema_usuario", "senha", {

      allowNull: false,

      type: Sequelize.STRING(255),

    });

  },

};

e rodei o comando npx sequelize-cli db:migrate

1 curtida

Só uma observação.

A estrutura de uma migration do sequelize, de acordo com a documentação é a seguinte:

module.exports = {
  up: (queryInterface, Sequelize) => {
    // logic for transforming into the new state
  },
  down: (queryInterface, Sequelize) => {
    // logic for reverting the changes
  }
}

ou seja, a propriedade down é usada para desfazer a operação que foi feita no up, e reparei que vc colocou o mesmo código tanto no up quanto no down na migração que vc criou.

1 curtida

Eu reparei e entendi isto, mas agora o campo senha está com 255 caracteres no banco.

Mas eu peguei este projeto em andamento, e segui o que estava nos create.

Todos tem up e down, até coloquei no primeiro poste deste

Pelo que entendi, a migration tem que ter o up e o down mesmo, mas no down é o que será executado para reverter o que foi feito no up. Porém, é bom dá uma lida na documentação para entender melhor esses detalhes.

1 curtida

Vou reler. Mas valeu pelo toque

1 curtida