您好,匿名用户
随意问技术百科期待您的加入

那些ORM的库要怎么解决+1-1这样时的安全问题

+1 投票

简单的说就是我要执行

update table set value = value + 1 where id = XXX

这样的语句,我在可是似乎并不是所有的ORM库都支持这种操作,举个栗子,我在rails里面有看到update可以支持传入+1、-1这样的参数。可是我在nodejs的jugglingdb里面居然没有找到。

MySQL.prototype.toFields = function (model, data) {
    var fields = [];
    var props = this._models[model].properties;
    Object.keys(data).forEach(function (key) {
        if (props[key]) {
            var value = this.toDatabase(props[key], data[key]);
            if ('undefined' === typeof value) return;
            fields.push('`' + key.replace(/\./g, '`.`') + '` = ' + value);
        }
    }.bind(this));
    return fields.join(',');
};
MySQL.prototype.toDatabase = function (prop, val) {
    if (val === null) return 'NULL';
    if (val === undefined) return;
    if (val.constructor.name === 'Object') {
        var operator = Object.keys(val)[0]
        val = val[operator];
        if (operator === 'between') {
            return  this.toDatabase(prop, val[0]) +
                    ' AND ' +
                    this.toDatabase(prop, val[1]);
        } else if (operator == 'inq' || operator == 'nin') {
            if (!(val.propertyIsEnumerable('length')) && typeof val === 'object' && typeof val.length === 'number') { //if value is array
                for (var i = 0; i < val.length; i++) {
                    val[i] = this.client.escape(val[i]);
                }
                return val.join(',');
            } else {
                return val;
            }
        }
    }
    if (!prop) return val;
    if (prop.type.name === 'Number') return Number(val);
    if (prop.type.name === 'Date') {
        if (!val) return 'NULL';
        if (!val.toUTCString) {
            val = new Date(val);
        }
        return '"' + dateToMysql(val) + '"';
    }
    if (prop.type.name == "Boolean") return val ? 1 : 0;
    if (typeof prop.type === 'function') return this.client.escape(prop.type(val));
    return this.client.escape(val.toString());
};

可以看出,完全不支持。

可是这十分不应该,+1-1这种操作明显是需要线程安全的(nodejs的话就是进程级别了……)可是ORM的select操作是不带锁的(带了也没用啊……)这样出错的概率非常的大。要怎么解决这个问题?

我并不想对原有代码做太多改动,不然我也不会用ORM的库了,能否他通过一些技巧达到这个目的,或者有什么别的OR妈的库可以推荐的吗?

用户头像 提问 2013年 9月9日 @ Malzahar 上等兵 (335 威望)
分享到:

你的回答

隐私保护: 您的邮箱仅用于发送系统通知。
请输入验证码:
    图片验证码看不清?
登录注册后不会被要求输入验证码。

提一个问题:

相关问题

0 投票
1 回复 34 阅读
0 投票
1 回复 31 阅读
用户头像 提问 2012年 12月1日 @ Hepheastus 上等兵 (182 威望)
0 投票
1 回复 30 阅读
0 投票
1 回复 36 阅读
用户头像 提问 2012年 12月1日 @ Riven 上等兵 (334 威望)
0 投票
1 回复 41 阅读
用户头像 提问 2013年 11月23日 @ Demeter 上等兵 (208 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...