SenseOrm

ORM for every database: mongodb, mysql, redis

npm install SenseOrm
8 downloads in the last week
9 downloads in the last month

About

SenseOrm is cross-db ORM, providing common interface to access most popular database formats. Currently supported are: mongodb, redis, mysql and js-memory-storage. You can add your favorite database adapter, checkout one of the existing adapters to learn how, it's super-easy, I guarantee.

Installation

npm install senseorm

Usage

var Schema = require('senseorm').Schema;
var s = new Schema('mongoose');
// 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 }
});
// simplier way to describe model
var User = schema.define('User', {
    name:         String,
    bio:          Schema.Text,
    approved:     Boolean,
    joinedAt:     Date,
    age:          Number
});

// setup relationships
User.hasMany(Post,   {as: 'posts',  foreignKey: 'user_id'});
// creates instance methods:
// user.posts(conds)
// user.posts.build(data) // like new Post({user_id: user.id});
// user.posts.create(data) // build and save

Post.belongsTo(User, {as: 'author', foreignKey: 'user_id'});
// 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

s.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);
});

// 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({userId: user.id});
// the same as prev
user.posts(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(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.isValid() // false
user.errors // hash of errors {attr: [errmessage, errmessage, ...], attr: ...}

Read the tests for usage examples: ./test/common_test.js

Running tests

All tests are written using nodeunit:

nodeunit test/common_test.js

If you run this line, of course it will fall, because it requres different databases to be up and running, but you can use js-memory-engine out of box! Specify ONLY env var:

ONLY=memory nodeunit test/common_test.js

of course, if you have mongoose running, you can run

ONLY=mongoose nodeunit test/common_test.js

Package structure

Now all common logic described in ./lib/*.js, and database-specific stuff in ./lib/adapters/*.js. It's super-tiny, right?

Common:

  • transparent interface to APIs
  • -before and -after hooks on save, update, destroy
  • scopes
  • default values
  • more relationships stuff
  • docs

Databases:

  • low-level mysql
  • postgres
  • mongodb
  • redis
  • js-memory-storage
npm loves you