- Notifications
You must be signed in to change notification settings - Fork9
Arel ported to node js — with some changes
License
yang/rel
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Rel is a SQL AST manager for Node JS. It is a straight port ofhttps://github.com/rails/arel. Although it does have some changes of note. These are:
- No reliance on a database connection. This library builds queriesonly.
- It obviously can't use all of the ruby-isms like over-riding thearray operator so methods are used instead.
It still holds the same goals as Arel which are:
- Simplifies the generation complex of SQL queries.
- Adapts to various RDBMS systems
Before you ask, there will also be a port of ActiveRecord coming in the next little bit.
npm install rel
Unfortunately the package is currently purely Coffeescript, with noaccompanying JS compilation in the git repo. To use this with a JS project,you can compile the files in-place with:
npm run build
This is a bandaid for the time being.
users = new Rel.Table 'users'users.project(Rel.star()).toSql()
Will produce
SELECT * FROM users
A more complicated example of command queries is:
users.where(users.column('name').eq('amy'))# => SELECT * FROM users WHERE users.name = 'amy'
In SQL the selection would contain what you are getting from thedatabase, this is called a projection in Rel.
users.project(users.column('id')) # => SELECT users.id FROM users
Joins resemble SQL:
users.join(photos).on(users.column('id').eq(photos.column('user_id')))# => SELECT * FROM users INNER JOIN photos ON users.id = photos.user_id
Limit and offset and calledtake andskip:
users.take(5) # => SELECT * FROM users LIMIT 5users.skip(4) # => SELECT * FROM users OFFSET 4
GROUP BY is called group:
users.group(users.column('name')) # => SELECT * FROM users GROUP BY name
You can chain all operators, for example:
users.where(users.column('name').eq('amy')).project(users.column('id'))# => SELECT users.id FROM users WHERE users.name = 'amy'
Another example:
users.where(users.column('name').eq('bob')).where(users.column('age').lt(25))
You can also pass in multiple arguments:
users.where(users.column('name').eq('bob'), users.column('age').lt(25))
The OR operator works like this:
users.where(users.column('name').eq('bob').or(users.column('age').lt(25)))
This is the same as the AS operator.
Founded and majority of development to date by Carl Woodward (@carlwoodward).
Current developer and maintainer is Yang Zhang (@yang).
To run tests, runnpm test
.
- Using special commit of vows to work aroundvowsjs/vows#296.