nodejs的跨数据库ORM框架:JugglingDB

jopen 11年前

JugglingDB为nodejs提供了一个跨数据库的ORM框架,通过一个共同的接口来访问大部分流行的数据库。当前支持:mysql, sqlite3, postgres, couchdb, mongodb, redis, neo4j 和js-memory-storage (yep, 自写的引擎仅用于测试使用)。你可以为没有支持的数据库添加适配器。可以模仿已有的例子编写,超级简单。

var Schema = require('jugglingdb').Schema;  var schema = new Schema('redis', {port: 6379}); //port number depends on your configuration  // define models  var Post = schema.define('Post', {      title:     { type: String, length: 255 },      content:   { type: Schema.Text },      date:      { type: Date,    default: Date.now },      published: { type: Boolean, default: false, index: true }  });    // simplier way to describe model  var User = schema.define('User', {      name:         String,      bio:          Schema.Text,      approved:     Boolean,      joinedAt:     Date,      age:          Number  }, {      restPath: '/users' // tell WebService adapter which path use as API endpoint  });    // define any custom method  User.prototype.getNameAndAge = function () {      return this.name + ', ' + this.age;  };    // models also accessible in schema:  schema.models.User;  schema.models.Post;    // setup relationships  User.hasMany(Post,   {as: 'posts',  foreignKey: 'userId'});  // creates instance methods:  // user.posts(conds)  // user.posts.build(data) // like new Post({userId: user.id});  // user.posts.create(data) // build and save    Post.belongsTo(User, {as: 'author', foreignKey: 'userId'});  // creates instance methods:  // post.author(callback) -- getter when called with function  // post.author() -- sync getter when called without params  // post.author(user) -- setter when called with object    schema.automigrate(); // required only for mysql NOTE: it will drop User and Post tables    // work with models:  var user = new User;  user.save(function (err) {      var post = user.posts.build({title: 'Hello world'});      post.save(console.log);  });    // or just call it as function (with the same result):  var user = User();  user.save(...);    // Common API methods    // just instantiate model  new Post  // save model (of course async)  Post.create(cb);  // all posts  Post.all(cb)  // all posts by user  Post.all({where: {userId: user.id}, order: 'id', limit: 10, skip: 20});  // the same as prev  user.posts(cb)  // get one latest post  Post.findOne({where: {published: true}, order: 'date DESC'}, cb);  // same as new Post({userId: user.id});  user.posts.build  // save as Post.create({userId: user.id}, cb);  user.posts.create(cb)  // find instance by id  User.find(1, cb)  // count instances  User.count([conditions, ]cb)  // destroy instance  user.destroy(cb);  // destroy all instances  User.destroyAll(cb);    // Setup validations  User.validatesPresenceOf('name', 'email')  User.validatesLengthOf('password', {min: 5, message: {min: 'Password is too short'}});  User.validatesInclusionOf('gender', {in: ['male', 'female']});  User.validatesExclusionOf('domain', {in: ['www', 'billing', 'admin']});  User.validatesNumericalityOf('age', {int: true});  User.validatesUniquenessOf('email', {message: 'email is not unique'});    user.isValid(function (valid) {      if (!valid) {          user.errors // hash of errors {attr: [errmessage, errmessage, ...], attr: ...}          }  })

项目主页:http://www.open-open.com/lib/view/home/1361956264756