Grand Central Records
A basic ORM/ActiveRecord library for use in smaller Node projects or frameworks. Work in progress.
TODO
- Finish tests
- Finish Query Method docs (below)
- Model#save()
- Model#remove()
- db#getColumns()
- MySQL Pool Connections
- Model validations
- Separate multiple queries for PG (like MySQL)
- Migration / synchronization
- MongoDB integration
Custom ORM
- Connects with
- Chainable queries
- Other functions/aliases
- .findByIdAndUpdate()
- .findByIdAndRemove()
- .create()
- Raw queries
- .query() (on SQL databases) -- executes the given query
- .queue(query string or chain) (accepts array, string, object)
- .run() -- executes all queries in the queue
Inspiration
Documentation
Samples:
var GCR = require('grand-central-records');
var Model = new GCR({
adapter: "mysql",
host: "localhost",
database: "test",
username: "admin",
password: "admin"
}, "users");
Model.find(8, function(err, user){
if (err) throw err;
console.log(user.name);
});
Model.select(["name","address"]).where({admin: true}, function(err, result) {
if (err) throw err;
result.forEach(function(user) {
...
});
});
Multiple models can also be created from the same database.
var GCR = require('grand-central-records');
var db = new GCR({
adapter: "mysql",
host: "localhost",
database: "test",
username: "admin",
password: "admin"
}, { verbose: true });
var User = db.model("users"),
Project = db.model("projects");
Raw Queries
.query(query, [values], callback)
Execute raw query to database.
db.query('SELECT 1 AS a', function(err, res) {
console.log(res[0].a);
});
db.query('SELECT 1 AS a; SELECT %2 AS a;', ['hello'], function(err, res) {
console.log(res[0].a);
console.log(res[1].a);
});
db.query('SELECT :name AS a', { name: 'hello' }, function(err, res) {
console.log(res[0].a);
})
.queue(query, [values])
Add query to queue for layer execution. Query can be a raw query string, a chained method object, or an array of either. Values can't be passed to objects or arrays (only raw strings);
db.queue('SELECT 1 AS a')
.queue('SELECT %1', [2])
.queue('SELECT :name AS a', { name: 'hello' })
.run(function(err, res) {
console.log(res[0].a);
console.log(res[2].a);
});
db.queue(Model.find(1))
.queue(Model.select('name').limit(1))
.run(function(err, res) {
console.log(res[0]);
console.log(res[1]);
});
db.queue(['SELECT 1 AS a', 'SELECT 2 AS a']);
. . .
db.run(function(err, res) {
console.log(res[0].a);
console.log(res[1].a);
});
Models
To map query results to a model, pass map: true
to model options, like this:
var User = db.model('users', { map: true });
Expansion of models
Methods are functions that can be called on the model.
var User = db.model('users', {
map: true,
methods: {
add: function(n) {
return this.number + n;
}
}
});
. . .
console.log(user.number);
console.log(user.add(5));
Getters are methods that are called immediately and act as regular values for a model. They can supplement or replace previous values.
var User = db.model('users', {
map: true,
getters: {
first: function() {
return this.first.toUpperCase();
},
fullName: function() {
return this.first + ' ' + this.last;
}
}
});
. . .
console.log(user.first);
console.log(user.last);
console.log(user.fullName);
.reload()
Reloads the model's original data.
User.find(1, function(err, user) {
user.name = 'Mark';
console.log(user.name);
user.reload();
console.log(user.name);
});
Query Methods:
.all()
.find()
.where()
.select()
.order()
.limit()
.offset()
.insert()
.update()
.remove()