yang/rel
{ "createdAt": "2011-04-23T00:42:53Z", "defaultBranch": "master", "description": "Arel ported to node js — with some changes", "fullName": "yang/rel", "homepage": "http://yang.github.com/rel/", "language": "CoffeeScript", "name": "rel", "pushedAt": "2016-07-24T05:38:23Z", "stargazersCount": 135, "topics": [], "updatedAt": "2023-11-20T01:45:11Z", "url": "https://github.com/yang/rel"}Description
Section titled “Description”Rel is a SQL AST manager for Node JS. It is a straight port of https://github.com/rails/arel. Although it does have some changes of note. These are:
- No reliance on a database connection. This library builds queries only.
- It obviously can’t use all of the ruby-isms like over-riding the array 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.
Installation
Section titled “Installation”npm install relUnfortunately the package is currently purely Coffeescript, with no accompanying JS compilation in the git repo. To use this with a JS project, you can compile the files in-place with:
npm run buildThis is a bandaid for the time being.
Introduction
Section titled “Introduction”users = new Rel.Table 'users'users.project(Rel.star()).toSql()Will produce
SELECT * FROM usersA 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 the database, this is called a projection in Rel.
users.project(users.column('id')) # => SELECT users.id FROM usersJoins 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_idLimit and offset and called take and skip:
users.take(5) # => SELECT * FROM users LIMIT 5users.skip(4) # => SELECT * FROM users OFFSET 4GROUP BY is called group:
users.group(users.column('name')) # => SELECT * FROM users GROUP BY nameYou 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.
Contributors
Section titled “Contributors”Founded and majority of development to date by Carl Woodward ([@carlwoodward]).
Current developer and maintainer is Yang Zhang ([@yang]).
Development
Section titled “Development”To run tests, run npm test.
Setup notes
Section titled “Setup notes”- Using special commit of vows to work around https://github.com/flatiron/vows/issues/296.
[@carlwoodward] !: //github.com/carlwoodward [@yang] !: //github.com/yang