web-dev-qa-db-fra.com

Spécification de champs spécifiques avec Sequelize (NodeJS) au lieu de *

D'accord, j'ai donc un projet dans NodeJS où j'utilise Sequelize pour un ORM MySQL. La chose fonctionne de manière fantastique, mais j'essaie de savoir s'il existe un moyen de spécifier quels champs sont renvoyés sur la base d'une requête ou s'il y a même un moyen de faire un .query () quelque part.

Par exemple, dans notre base de données d'utilisateurs, il peut y avoir des quantités ridicules d'enregistrements et de colonnes. Dans ce cas, je dois renvoyer trois colonnes uniquement afin qu'il soit plus rapide d'obtenir uniquement ces colonnes. Cependant, Sequelize interroge simplement la table pour tout "*" afin de remplir le modèle d'objet complet autant que possible. C'est la fonctionnalité que j'aimerais contourner dans ce domaine particulier de l'application.

37
Aric

Vous devez spécifier les attributs en tant que propriété dans l'objet que vous passez à findAll ():

Project.findAll({attributes: ['name', 'age']}).on('success', function (projects) {
  console.log(projects);
});

Comment j'ai trouvé ça:

La requête est d'abord appelée ici: https://github.com/sdepold/sequelize/blob/master/lib/model-definition.js#L131
Se construit ensuite ici: https://github.com/sdepold/sequelize/blob/master/lib/connectors/mysql/query-generator.js#L56-59

68
alessioalex

Essayez ceci dans la version nouvelle

template.findAll({
    where: {
        user_id: req.params.user_id //array
    },
    attributes: ['id', 'template_name'], //object
}).then(function (list) {
    res.status(200).json(list);
})
8
Adiii

Utilisez les tableaux de la clé d'attribut. Vous pouvez créer des tableaux imbriqués pour les alias.

Project.findAll({
  attributes: ['id', ['name', 'project_name']],
  where: {id: req.params.id}
})
.then(function(projects) {
  res.json(projects);
})

Donnera:

SELECT id, name AS project_name FROM projects WHERE id = ...;
0
GavinBelson