node.js学习笔记(26) node-orm进阶一

上一个笔记中,我们已经认识了node-orm,它可以支持mongodb、mysql、postgres、  redshift、 _shared和sqlite。


之所以能支持这么多中数据库,是因为node-orm的lib中有对各种数据库支持的backend脚本,可以看一下orm/lib/Drivers/DML目录下的文件有mongodb.js、mysql.js、postgres.js、redshift.js、_shared.js、sqlite.js。这其中的每一个脚本其实都是对各种数据库驱动的封装,以mysql.js为例,我们可以看一下它的源码,它是依赖于mysql模块的。


mysql.js:
var _       = require("lodash");
var mysql   = require("mysql");
var Query   = require("sql-query").Query;
var shared  = require("./_shared");
var DDL     = require("../DDL/SQL");

exports.Driver = Driver;
...

找到了node-orm的根源,再来学习和使用node-orm,是不是有底气多了!

Properties

先看上一篇笔记中的源码片段:
    var User = db.define("user", {
        id          :Number,
        name        :String,
        username    :String,
        password    :String,
        birthday    :Date
    });

这是Model定义的一种写法,把数据库的数据类型映射为node.js的类型,长度、唯一、是否可空等配置将使用数据库中的定义。Node.js的类型有Number、String、Boolean、Date、Object、Buffer和
Array。
还有一种更常用的写法,可以设置field的更多信息:
    var User = db.define("user", {
        id          :{type:'serial', mapsTo:'id', unique:true, size:11},
        name        :{type:'text', mapsTo:'name'},
        username    :{type:'text', mapsTo:'username'},
        password    :{type:'text', mapsTo:'password'},
        birthday    :{type:'date', mapsTo:'birthday', time:true}
    });

Node-orm支持10种类型:
  • text: A text string;
  • number: A floating point number. You can specify size: 2|4|8.
  • integer: An integer. You can specify size: 2|4|8.
  • boolean: A true/false value;
  • date: A date object. You can specify time: true
  • enum: A value from a list of possible values;
  • object: A JSON object;
  • point: A N-dimensional point (not generally supported);
  • binary: Binary data.
  • serial: Auto-incrementing integer. Used for primary keys.
注意:
每个类型都有require、defaultValue和size三个属性。text支持size和big(true/false,for大文本)。number支持size(表示位数)和unsigned(true/false)。date支持time(true/false,是否包含时间)。

除此之外,我们还可以自定义类型:
db.defineType('numberArray', {
  datastoreType: function(prop) {
    return 'TEXT'
  },
  // This is optional
  valueToProperty: function(value, prop) {
    if (Array.isArray(value)) {
      return value;
    } else {
      return value.split(',').map(function (v) {
        return Number(v);
      });
    }
  },
  // This is also optional
  propertyToValue: function(value, prop) {
    return value.join(',')
  }
});
var LottoTicket = db.define('lotto_ticket', {
  numbers: { type: 'numberArray' }
});




上一篇:node.js学习笔记(15) child_process(二)


下一篇:node.js学习笔记(17) cluster