Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are there any ORM frameworks for Web SQL (javascript)? [closed]

Anyone knows if there's one available now or will be in a near future?

like image 821
bennedich Avatar asked Aug 31 '10 20:08

bennedich


3 Answers

I am looking for the same thing. It seems like slim pickings. The one that looked the most promising to me is persistence.js. Impel also looks good but, unfortunately, it looks like it hasn't been updated in a year and a half. ActiveRecord.js could end up working out, but it doesn't seem like they are supporting Web SQL yet. Hopefully someone will post some more options.

like image 45
jmans Avatar answered Nov 13 '22 09:11

jmans


There's a new one called JayData library, this one is like EntityFramework (or NHibernate) for the JavaScript platform: provides JavaScript Language Query (JSLQ) and JavaScript CRUD. Also supports model definitions, navigationProperties and 1..1.0, 1..m, m..n relations.

I copy a short codesnippet on how to use it:

//define storage model: Department and Employee in a 1..m relation

$data.Entity.extend("$org.types.Department", {
  Id: { type: "int", key: true, computed: true },
  Name: { type: "string", required: true },
  Address: { type: "string" },
  Employees: { type: "Array", elementType: "$org.types.Employee", inverseProperty:"Department" }
});


$data.Entity.extend("$org.types.Employee", {
  Id: { type: "int", key: true, computed: true },
  FirstName: { type: "string", required: true },
  LastName: { type: "string", required: true }, 
  Department: { type: "$org.types.Department", inverseProperty:"Employees"}
});

$data.EntityContext.extend("$org.types.OrgContext", {
  Department: { type: $data.EntitySet, elementType: $org.types.Department },
  Employee: { type: $data.EntitySet, elementType: $org.types.Employee }
});

You can code against the OrdContext and the collections in it. The following line will create a context instance that is backed by local WebSQL (you have other options like indexeddb or OData)

var context = new $org.types.OrgContext({ name: "webSql", databaseName: "OrgDB" });

Add some data

var department = new $org.types.Department({ Name: 'Finance', Employees: [] });

var emp1 = new $org.types.Employee({ FirstName: 'John', LastName: 'Smith'});
department.Employees.push(emp1);

var emp2 = new $org.types.Employee({ FirstName: 'Jane', LastName: 'Smith'});
emp2.Department = department;

context.add(department);
context.add(emp2);

context.saveChanges();

Now that you have data in the store you can query it. JSLQ queries are supported on entity fields, plus navigation fields that point in the m..1 direction. (In version 1.0 you can not directly against 1..m navProperties. You can circumvent this with the in expression

//filter
context.Employees
  .filter( function(emp) { return emp.LastName == 'Smith' })
  .toArray(...);

//filter
context.Employees
  .filter( function(emp) { return emp.FirstName.startsWith('J') ||
                                  emp.LastName.toLowerCase.contains('mith') })
  .toArray(...);

//filter2
context.Employees
  .filter( function(emp) { return emp.Department.Id == 1 })
  .toArray( function(emps) { } );

//filter2 + eager load
context.Employees
  .include("Department")
  .filter( function(emp) { return emp.Department.Id == 1 })
  .toArray( function(emps) { } );


//map/project
context.Employees
  .filter( function(emp) { return emp.Department.Id == 1 }).toArray(...)
  .map( function(emp) { return { EmployeeName: emp.FirstName + emp.LastName, 
                                DepartmentName: emp.Department.Name }})
  .forEach( function(item) { ... })
like image 161
Peter Aron Zentai Avatar answered Nov 13 '22 09:11

Peter Aron Zentai


I am also looking for the same thing. JazzRecord looks like a likely candidate.

like image 1
Elmo Avatar answered Nov 13 '22 10:11

Elmo