web-dev-qa-db-ja.com

*の代わりにSequelize(NodeJS)を使用して特定のフィールドを指定する

さて、私はNodeJSで、MySQL ORMにSequelizeを使用しているプロジェクトを持っています。物事は素晴らしく動作しますが、クエリベースで返されるフィールドを指定する方法があるかどうか、またはどこかに.query()を実行する方法さえあるかどうかを把握しようとしています。

たとえば、ユーザーデータベースには、途方もない量のレコードと列が存在する場合があります。この場合、3つの列のみを返す必要があるため、これらの列のみを取得する方が高速です。ただし、Sequelizeは、可能な限り完全なオブジェクトモデルを実現するために、すべての "*"をテーブルに照会するだけです。これは、アプリケーションのこの特定の領域でバイパスしたい機能です。

37
Aric

FindAll()に渡すオブジェクトのプロパティとして属性を指定する必要があります。

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

私がこれを見つけた方法:

クエリは最初にここで呼び出されます: https://github.com/sdepold/sequelize/blob/master/lib/model-definition.js#L131
次に、ここで構築されます: https://github.com/sdepold/sequelize/blob/master/lib/connectors/mysql/query-generator.js#L56-59

68
alessioalex

new versionでこれを試してください

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

属性キーで配列を使用します。エイリアスのネストされた配列を実行できます。

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

生成されます:

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