diff --git a/README.md b/README.md index c3cb78b1..d0f81b79 100644 --- a/README.md +++ b/README.md @@ -1 +1,137 @@ -Read the tests! +## About + +JugglingDB - cross-db ORM, providing common ORM 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. + +## Installation + + git clone git://github.com/1602/jugglingdb.git + +## Usage + +```javascript +var Schema = require('./juggling').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: Date.now }, + 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.id}); +// user.createPost(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 + +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.buildPost({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.buildPost +// save as Post.create({userId: user.id}, cb); +user.createPost(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); +``` + +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): + + require('couch-db-adapter'); + +## 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. + +## Contributing + +If you have found a bug please write unit test, and make sure all other tests still pass before pushing code to repo. + +## Roadmap + +### Common: + ++ validations ++ -before and -after hooks on save, update, destroy ++ default values ++ more relationships stuff ++ docs + +### Databases: + ++ riak ++ couchdb ++ low-level mysql ++ postgres ++ sqlite + +## License + +MIT