まず、テーブルが削除されるのではなく、すべての行が削除されます。次に、「<a href="https://github.com/felixge/node-mysql#escaping-query-values" rel="nofollow">準備済みステートメント」を使用します。
以下はやや肥大化していますが、主なアイデアは に似た関数を使用することremoveQuery
です。等式とは異なる条件が必要な場合は、変更されたバージョンに次のような文字列として渡すことができますpost_rating < ?
(ユーザーではなく、結果の sql は次のようになりますDELETE FROM posts WHERE post_rating < ?;
)。
ただし、検証、スキーマ、および同様のものは、何らかのORMに移動する必要があります。
var util = require('util');
var db = {
query: function (sql, params, callback) {
console.log('executing sql `%s` with params `%j`', sql, params);
callback();
}
};
function removeQuery(db, table, whereField, type) {
var sql = util.format('DELETE FROM %s WHERE %s = ?;', table, whereField);
var fn = db.query.bind(db, sql);
return function (value, callback) {
callback = callback || function () {};
if (typeof value != type) {
var message = util.format('Invalid type of `%s` field: should be `%s`; got `%s`',
whereField, type, typeof value);
var err = new Error(message);
console.error(err);
return process.nextTick(callback.bind(null, err));
}
fn([value], callback);
};
}
exports.removeUserByUsername = removeQuery(db, 'users', 'username', 'string');
exports.removePostByUserId = removeQuery(db, 'posts', 'user_id', 'number');
[42, 'tony', undefined].forEach(function (val) {
exports.removeUserByUsername(val);
exports.removePostByUserId(val);
});