Sequelize.jsクエリを削除しますか?


99

findAllのような削除/ deleteAllクエリを作成する方法はありますか?

たとえば、私は次のようなことをしたいです(MyModelがSequelizeモデルであると仮定します...):

MyModel.deleteAll({ where: ['some_field != ?', something] })
    .on('success', function() { /* ... */ });

回答:


236

Sequelizeバージョン3以降を使用している場合は、次を使用します。

Model.destroy({
    where: {
        // criteria
    }
})

Sequelizeドキュメント - Sequelizeチュートリアル


それはかなり古い質問なので、当時のSequelizeには驚くほど破壊メソッドがなかったと思います
ncksllvn

3
けっこうだ; ただし、これはGoogleでの最初の検索結果であり、既に質問されている質問をすることもできません。そのため、承認された回答は更新されるようですが、それはおそらくサイト全体の問題です。
Rojuinex

1
sequelizeのドキュメントが提供しないのではないかと思います。これはかなり簡単なコーディングサンプルです...だれでもこれを理解できます。ncksllvnありがとうございます。あなたは私の時間を節約します...
weeraa 2018年

IDが無効なIDである場合、どのように処理しますか?
ロッド

21

私は次のファイルにステップバイステップでコードを深く調べました:

https://github.com/sdepold/sequelize/blob/master/test/Model/destroy.js

https://github.com/sdepold/sequelize/blob/master/lib/model.js#L140

https://github.com/sdepold/sequelize/blob/master/lib/query-interface.js#L207-217

https://github.com/sdepold/sequelize/blob/master/lib/connectors/mysql/query-generator.js

私が見つけたもの:

deleteAllメソッドはありません。たとえば、レコードで呼び出すdestroy()メソッドがあります。

Project.find(123).on('success', function(project) {
  project.destroy().on('success', function(u) {
    if (u && u.deletedAt) {
      // successfully deleted the project
    }
  })
})

ええ、私はdestroyメソッドについて知っていましたが、残念ながらそれは1つのレコードだけのためのものです。自分でdeleteAllメソッドを作成する必要があると思います。ありがとう!
Lakenen

これが存在しないことは本当に奇妙です。多分あなたはそれを自分で書いて、sequelizeするプルリクエストを提出することができます。きっと他の人にも使えそうだと思います。
alessioalex

1
プルリクエストを送信するか、githubリポジトリで問題を開いてください:)
sdepold

3
destroy()はsequelizejs.comのドキュメントにはありません。誰か他の人が私と同じように探していた場合に備えて
mikermcneil

2
あなたのリンクはすべて私に404を返しています。私だけですか?
OrwellHindenberg 2016年

16

質問がまだ関連性があるかどうかはわかりませんが、Sequelizeのドキュメントで以下を見つけました。

User.destroy('`name` LIKE "J%"').success(function() {
    // We just deleted all rows that have a name starting with "J"
})

http://sequelizejs.com/blog/state-of-v1-7-0

それが役に立てば幸い!


2
参考までに、これはlib / model.jsで定義されており、文字列を使用する必要はありません。任意の種類のwhereオブジェクト(例:)を使用できます{someId: 123}
ドミ2014年

10

この例は、コールバックの代わりにプロミスする方法を示しています。

Model.destroy({
   where: {
      id: 123 //this will be your id that you want to delete
   }
}).then(function(rowDeleted){ // rowDeleted will return number of rows deleted
  if(rowDeleted === 1){
     console.log('Deleted successfully');
   }
}, function(err){
    console.log(err); 
});

詳細については、このリンクを確認してください http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger


1
1つの行が正常に削除されたことを確認するときに、rowDeletedを1にすべきではありませんか?
サラフ

1
これはもはやそのようには機能しません。戻り値は影響を受けた行IDであり、影響を受けた行の数ではありません。
トニーバトラー

コールバックの代わりにキャッチを使用してエラーをキャッチするべきではありませんか?
アーメドグリブ

7

新しいバージョンでは、このようなものを試すことができます

function (req,res) {    
        model.destroy({
            where: {
                id: req.params.id
            }
        })
        .then(function (deletedRecord) {
            if(deletedRecord === 1){
                res.status(200).json({message:"Deleted successfully"});          
            }
            else
            {
                res.status(404).json({message:"record not found"})
            }
        })
        .catch(function (error){
            res.status(500).json(error);
        });

4

Await / Asyncを使用したES6の例を次に示します。

    async deleteProduct(id) {

        if (!id) {
            return {msg: 'No Id specified..', payload: 1};
        }

        try {
            return !!await products.destroy({
                where: {
                    id: id
                }
            });
        } catch (e) {
            return false;
        }

    }

!!結果をブール値に変更するawaitの結果に私がBang Bangオペレーターを使用していることに注意してください。


2

時間を節約できるように、私はしばらくの間、Sailsに対して次のようなものを書きました。

使用例:

// Delete the user with id=4
User.findAndDelete(4,function(error,result){
  // all done
});

// Delete all users with type === 'suspended'
User.findAndDelete({
  type: 'suspended'
},function(error,result){
  // all done
});

ソース:

/**
 * Retrieve models which match `where`, then delete them
 */
function findAndDelete (where,callback) {

    // Handle *where* argument which is specified as an integer
    if (_.isFinite(+where)) {
        where = {
            id: where
        };
    }

    Model.findAll({
        where:where
    }).success(function(collection) {
        if (collection) {
            if (_.isArray(collection)) {
                Model.deleteAll(collection, callback);
            }
            else {
                collection.destroy().
                success(_.unprefix(callback)).
                error(callback);
            }
        }
        else {
            callback(null,collection);
        }
    }).error(callback);
}

/**
 * Delete all `models` using the query chainer
 */
deleteAll: function (models) {
    var chainer = new Sequelize.Utils.QueryChainer();
    _.each(models,function(m,index) {
        chainer.add(m.destroy());
    });
    return chainer.run();
}

from:orm.js

お役に立てば幸いです。


0
  1. レコードを削除する最良の方法は、最初にレコードを見つけることです(データベース内に存在し、同時に削除したい場合)。
  2. このコードを見る
const StudentSequelize = require("../models/studientSequelize");
const StudentWork = StudentSequelize.Student;

const id = req.params.id;
    StudentWork.findByPk(id) // here i fetch result by ID sequelize V. 5
    .then( resultToDelete=>{
        resultToDelete.destroy(id); // when i find the result i deleted it by destroy function
    })
    .then( resultAfterDestroy=>{
        console.log("Deleted :",resultAfterDestroy);
    })
    .catch(err=> console.log(err));

0

すべて削除、条件なし:

Model.destroy({
    truncate: true,
})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.