Skip to content
Multi-database ORM: redis, mongodb, mysql, sqlite, postgres, neo4j, memory... Many databases, common API.
JavaScript Other
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


JugglingDB -- cross-db ORM, providing common interface to access most popular database formats. Currently supported: mysql, mongodb, redis, neo4j and js-memory-storage (yep, self-written engine for test-usage only). You can add your favorite database adapter, checkout one of existing adapters to learn how, it's super-easy, I guarantee.


git clone git://


var Schema = require('./jugglingdb').Schema;
var s = new Schema('redis');
// define models
var Post = schema.define('Post', {
    title:     { type: String, length: 255 },
    content:   { type: Schema.Text },
    date:      { type: Date,    detault: },
    published: { type: Boolean, default: false }
var User = schema.define('User', {
    name:         String,
    bio:          Text,
    approved:     Boolean,
    joinedAt:     Date,
    age:          Number

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

Post.belongsTo(User, {as: 'author', foreignKey: 'userId'});
// creates instance methods:
// -- getter when called with function
// -- sync getter when called without params
// -- 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; (err) {
    var post = user.buildPost({title: 'Hello world'});;

// Common API methods

// just instantiate model
new Post
// save model (of course async)
// all posts
// all posts by user
// the same as prev
// same as new Post({userId:});
// save as Post.create({userId:}, cb);
// find instance by id
User.find(1, cb)
// count instances
// destroy instance
// destroy all instances

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

Your own database adapter

To use custom adapter, pass it package name as first argument to Schema constructor:

mySchema = new Schema('couch-db-adapter', {host:.., port:...});

Make sure, your adapter can be required (just put it into ./node_modules):


Running tests

All tests 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 redis running, you can run

ONLY=redis nodeunit test/common_test.js

Package structure

Now all common logic desribed in ./index.js, and database-specific stuff in ./lib/*.js. It super-tiny, yep?

Project status

This project written in one weekend (1,2 oct 2011), and of course it not pretend to be preduction-ready, but I plan to use this project as default ORM for RailwayJS in nearest future. So, if you familiar with some database engines - please help me to improve adapter for that database.

For example, I know, mysql implementation sucks now, 'cause I'm not digging too deep into SequelizeJS code, and I think would be better to replace sequelize with something low-level in nearest future, such as mysql package from npm.


If you have found a bug please write unit test, and make sure all other tests still pass before pushing code to repo.



  • validations
  • -before and -after hooks on save, update, destroy
  • default values
  • more relationships stuff
  • docs


  • riak
  • couchdb
  • low-level mysql
  • postgres
  • sqlite



Something went wrong with that request. Please try again.