An ORM for rust
```rust
extern crate rustorm; extern crate uuid; extern crate chrono; extern crate rustc_serialize;
use uuid::Uuid; use chrono::datetime::DateTime; use chrono::offset::utc::UTC; use rustc_serialize::json;
use rustorm::query::Query; use rustorm::query::{Filter,Equality}; use rustorm::dao::{Dao,IsDao}; use rustorm::database::Pool;
pub struct Product {
pub product_id:Uuid,
pub name:Option
impl IsDao for Product{ fn fromdao(dao:&Dao)->Self{ Product{ productid: dao.get("productid"), name: dao.getopt("name"), description: dao.get_opt("description"), } } }
fn main(){ let mut pool = Pool::init(); let url = "postgres://postgres:p0stgr3s@localhost/bazaarv6"; let db = pool.getdbwithurl(&url).unwrap();
let products: Vec<Product> = Query::select_all()
.from_table("bazaar.product")
.collect(db.as_ref());
for prod in products{
let name = prod.name.unwrap();
let desc = match prod.description{
Some(desc) => desc,
None => "".to_string()
};
println!("{} {} {:?}", prod.product_id, name, desc);
}
pool.release(db);
} ```
```rust
pub struct Photo {
pub photo_id:Uuid,
pub url:Option
impl IsDao for Photo{ fn fromdao(dao:&Dao)->Self{ Photo{ photoid: dao.get("photoid"), url: dao.getopt("url"), } } }
fn main(){ let mut pool = Pool::init(); let url = "postgres://postgres:p0stgr3s@localhost/bazaarv6"; let db = pool.getdbwithurl(&url).unwrap();
let photo: Photo = Query::select_all()
.enumerate_column("photo.url")
.from_table("bazaar.product")
.left_join("bazaar.product_photo",
"product.product_id", "product_photo.product_id")
.left_join("bazaar.photo",
"product_photo.photo_id", "photo.photo_id")
.filter("product.name", Equality::EQ, &"GTX660 Ti videocard")
.collect_one(db.as_ref());
println!("photo: {} {}",photo.photo_id, photo.url.unwrap());
pool.release(db);
} ```
```rust
let mut pool = Pool::init();
let url = "postgres://postgres:p0stgr3s@localhost/bazaar_v6";
let db = pool.get_db_with_url(&url).unwrap();
let mut query = Query::select_all();
query.from_table("bazaar.product")
.left_join("bazaar.product_category",
"product_category.product_id", "product.product_id")
.left_join("bazaar.category",
"category.category_id", "product_category.category_id")
.left_join("product_photo",
"product.product_id", "product_photo.product_id")
.left_join("bazaar.photo",
"product_photo.photo_id", "photo.photo_id")
.filter("product.name", Equality::EQ, &"GTX660 Ti videocard")
.filter("category.name", Equality::EQ, &"Electronic")
.group_by(vec!["category.name"])
.having("count(*)", Equality::GT, &1)
.asc("product.name")
.desc("product.created")
;
let frag = query.build(db.as_ref());
let expected = "
SELECT * FROM bazaar.product LEFT OUTER JOIN bazaar.productcategory ON productcategory.productid = product.productid LEFT OUTER JOIN bazaar.category ON category.categoryid = productcategory.categoryid LEFT OUTER JOIN productphoto ON product.productid = productphoto.productid LEFT OUTER JOIN bazaar.photo ON productphoto.photoid = photo.photoid WHERE product.name = $1 AND category.name = $2 GROUP BY category.name HAVING count(*) > $3 ORDER BY product.name ASC, product.created DESC".to_string(); println!("actual: {{{}}} [{}]", frag.sql, frag.sql.len()); println!("expected: {{{}}} [{}]", expected, expected.len()); assert!(frag.sql.trim() == expected.trim());
pool.release(db);
```
Follow me on twitter: @ivanceras
This is a 1 man show, so if you feel generous, please support this project at bountysource bountysource
Suggestions are much welcome!