sequelize.jsを使用してテーブルから個別の行を選択する方法はありますか?ドキュメントを調べましたが、「ファインダーメソッド」はこのタスクを実行する方法を指定していません。
7 に答える
次のクエリに DISTINCT を適用するとします。
Tuple.findAll({attributes: ['key', 'value']});
次に、これは、クエリ全体を自分で記述しなくても、目的を達成するための (ハックな) 方法です。
Tuple.findAll({attributes: [[Sequelize.literal('DISTINCT `key`'), 'key'], 'value']});
(Sequelize v2.1.0 でテスト済み)
編集 2015-06-08: Sequelize v3.1.1 でも動作します
「node_modules/sequelize / lib / dialogts / mysql/query-generator.js」を編集します
118行目あたり
変化する
var query = "SELECT <%= attributes %> FROM <%= table %>"
の中へ
var query = "SELECT " + ((options.distinct)? 'DISTINCT ':'') +"<%= attributes %> FROM <%= table %>",
distinct: true
これで、続編リクエストにオプションを追加できます
お役に立てば幸いです-_^
自動的に行うことはできませんが、自分で SQL を作成することを気にしない場合は、次のようにすることができます。
sequelize.query('sql goes here', null, { raw: plain }).success(function(data){
console.log(data)
})
楽しむ :)
アップデート
- Sequelizeはas promise 関数
then
の代わりに使用するようになりました。success
Sequelize.query
パラメータのみを使用するようにリファクタリングされsql
、options
raw
受け入れますtrue/false
がplain
、値として受け入れません。
したがって、新しいバージョンによると、コードは次のようになります。
sequelize.query('sql goes here', { raw: true }).then(function(data){
console.log(data);
});
Sequelize バージョン 1.7 の時点で、select クエリは lib/dialects/abstract/query-generator.js に移動されました。
1167行目辺りで変更
mainQueryItems.push("SELECT "+mainAttributes.join ....)
に
mainQueryItems.push('SELECT '); if (options.distinct) { mainQueryItems.push('DISTINCT '); } mainQueryItems.push(mainAttributes.join(', ') + ' FROM ' + options.table);
ちなみに、私は「DISTINCT」に対応しているSqliteとPostgresを使っています。使用しているすべての SQL フレーバーに対して生成されるため、distinct をサポートしない方言を使用している場合、明らかにこの行が問題を引き起こします。これが、この単純な変更がメインの Sequelize ソース ツリーに反映されていない理由だと思います。