1
votes

Changer le nom de la colonne Sequelize

Je veux changer le nom de colonne par défaut dans ma sortie finale qui provient de la base de données Mysql lorsque j'accède à la base de données en utilisant la connexion NodeJS et Sequelize. Je me connecte en utilisant le code suivant: -

import Sequelize from "sequelize";

    let dbConnection = new Sequelize('DB', 'abc', 'password', {
        host: '127.0.0.1',
        port: 4242,
        dialect: 'mysql',
        dialectOptions: {
            requestTimeout: 0,
        },
    });

const Listing = dbConnection.define('TableName', {
    tour_title: {
        type: Sequelize.STRING,
    }
}, { freezeTableName: true, timestamps: false });

Par exemple, je veux changer tour_title par tour_name dans la colonne ci-dessus uniquement dans la sortie finale de sequelize. Je ne souhaite aucun changement dans les noms des colonnes de la base de données.


3 commentaires

Voulez-vous un alias dans la sortie ou voulez-vous changer le nom de la colonne dans la base de données?


Non, je ne veux pas changer de nom dans la base de données. Vous pouvez dire que je veux un alias


Utilisez-vous find () ou d'autres méthodes pertinentes pour obtenir les enregistrements?


3 Réponses :


11
votes

Pour changer le nom de la colonne uniquement dans la sortie finale

sequelize db:migrate

Pour changer le nom de la colonne dans la base de données

Ceci peut vous aider, suivez ces étapes

Étape 1: npm install -g sequelize-cli Pour installer l'outil de ligne de commande sequelize

Étape 2: sequelize migration: create --name rename-column-tour_title-to-tour_name-in-tabelname

Étape 3: Ouvrez le fichier de migration nouvellement créé et ajoutez le code ci-dessous

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.renameColumn('tableName', 'tour_title', 'tour_name');
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.renameColumn('tableName', 'tour_name', 'tour_title');
  }
};

Étape 4: en ligne de commande, exécutez la commande ci-dessous

TableName.findAll({
  attributes: ['id', ['tour_title', 'tour_name']] /
})
.then((data) => {
 console.log(data);
});

Le nom de votre colonne a maintenant changé avec succès.


1 commentaires

Merci @Deepak pour une bonne solution, mais cela a changé le nom de la colonne dans la base de données. Mais je veux un nom mis à jour dans la sortie finale uniquement.



0
votes

Si vous voulez un alias pour un nom de colonne dans la sortie, vous pouvez faire quelque chose comme ceci:

TableName.findAll({
  attributes: ['id', ['tour_title', 'tour_name']] //id, tour_title AS tour_name
})
.then(function(data) {
  res.json(data);
});

Chaque fois que vous récupérez des enregistrements, vous pouvez écrire le nom de colonne dans une liste en cascade et créez un alias. Consultez la documentation ici: http://docs.sequelizejs.com/manual/tutorial/ querying.html


2 commentaires

@AbhishekAgarwal avez-vous vérifié si vous avez tous les champs énumérés ci-dessus dans la base de données? Les noms de colonne doivent correspondre à ceux mentionnés dans le code ci-dessus.


@AbhishekAgarwal avez-vous la colonne "id" dans la table de base de données? si vous ne l'avez pas, vous ne devez pas l'écrire dans le tableau des attributs. Vous pouvez écrire les noms de toutes les colonnes qui existent dans votre table. La suppression de «id» du tableau résoudrait le problème.



1
votes

Les réponses ci-dessus ne fonctionnent que pour les résultats de la requête. Si vous souhaitez conserver votre convention de nom de soulignement sur la base de données et utiliser par exemple camelCase pour votre environnement javascript, vous devez faire ceci:

const ChildTable = dbConnection.define('ChildTable', { //this table name is how you call it on sequelize
  tourTitle: { //this is the name that you will use on javascript
      field: 'tour_title', // this will be the name that you fetch on your db
      type: Sequelize.STRING,
  },
  parentTableId: { // You need to define the field on the model, otherwise on sequelize you'll have to use the db name of the field
      field: 'parent_table_id', //this is defined above on the association part
      type: Sequelize.INTEGER,
  }
}, { freezeTableName: true, timestamps: false, tableName: 'TableName', //this is the real name of the table on the db
underscored: true, });

ChildTable.associate = (models) => {
  ChildTable.belongsTo(models.ParentTable, {   as: 'ParentTable',   foreignKey: 'parent_table_id', onDelete: 'cascade' });
};

De cette façon, vous avez un "alias" pour vos champs sur tout l'environnement Sequelize / javascript et vous gardez vos noms sur la base de données. Voyez aussi que vous devez faire de même avec les clés étrangères sur les associations, sinon vous devrez utiliser le nom d'origine.


1 commentaires

Comment spécifiez-vous "champ" sur les associations? Mes colonnes sont soulignées mais les associations créent des noms de colonnes camelCase.