NoSQL ORM for relational db backed by SQLAlchemy
Project description
Overview
=========
`nosql` is a schemaless ORM for relational db backed by SQLAlchemy.
It's ultermately an implementation of the schemaless ORM introduced by Bret Taylor.
http://backchannel.org/blog/friendfeed-schemaless-mysql
Usage
=========
No instruction is better than real code! Say you are building a `Flask` app.
```python
import nosql
from app import db
class User(nosql.SchemalessModel):
engine = db.engine
indexes = (
('email',),
('facebook_id',),
('city',)
)
User.create_all()
user = User()
user.email = 'yixi.zhang.max@gmail.com'
user.name = 'Yixi Zhang'
user.save()
# find returns a generator
>>> [user.name for user in User.find()]
['Yixi Zhang']
# find_one returns an instance, support any attribute
>>> User.find_one(email='yixi.zhang.max@gmail.com').name
Yixi Zhang
# added_id & id is auto-generated
>>> user.id
e597bb954cf74d51937d5a5e9fd2f2b8
>>> user.added_id
1
# retrieve non-exist attr returns None
>>> user.idol
>>> user.delete()
>>> list(User.find())
[]
```
Index
=========
Because `nosql` creates index tables, querying random attribute is fast.
Some todo's for index
* `index_updater` allows indexes to be added later on and schedule data pushing in the background.
* `sharding` on index.
Database Support
=========
So far only tested `SQLite` and `PostgreSQL`
License
=========
Do whatever you want. Hope you enjoy using it.
=========
`nosql` is a schemaless ORM for relational db backed by SQLAlchemy.
It's ultermately an implementation of the schemaless ORM introduced by Bret Taylor.
http://backchannel.org/blog/friendfeed-schemaless-mysql
Usage
=========
No instruction is better than real code! Say you are building a `Flask` app.
```python
import nosql
from app import db
class User(nosql.SchemalessModel):
engine = db.engine
indexes = (
('email',),
('facebook_id',),
('city',)
)
User.create_all()
user = User()
user.email = 'yixi.zhang.max@gmail.com'
user.name = 'Yixi Zhang'
user.save()
# find returns a generator
>>> [user.name for user in User.find()]
['Yixi Zhang']
# find_one returns an instance, support any attribute
>>> User.find_one(email='yixi.zhang.max@gmail.com').name
Yixi Zhang
# added_id & id is auto-generated
>>> user.id
e597bb954cf74d51937d5a5e9fd2f2b8
>>> user.added_id
1
# retrieve non-exist attr returns None
>>> user.idol
>>> user.delete()
>>> list(User.find())
[]
```
Index
=========
Because `nosql` creates index tables, querying random attribute is fast.
Some todo's for index
* `index_updater` allows indexes to be added later on and schedule data pushing in the background.
* `sharding` on index.
Database Support
=========
So far only tested `SQLite` and `PostgreSQL`
License
=========
Do whatever you want. Hope you enjoy using it.