上一个笔记中,我们已经认识了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' }
});