Python models for schema-less databases.
Project description
Models is a lightweight framework for mapping Python classes to schema-less databases. It is not an ORM as it doesn’t map existing schemata to Python objects but instead defines them on a higher layer built upon a schema-less storage (key/value or document-oriented). You define models as a valuable subset of the whole database and work with only certain parts of existing entities – the parts you need.
Installation
$ sudo easy_install models
You will also need to install pyrant to enable the Tokyo Tyrant backend. However, you might want to use another library (or libraries) with Models.
Backends
Currently Tokyo Tyrant backend is included (using Pyrant), but any other backend can be more or less easily created by wrapping existing bindings in Storage and Query classes which can loosely follow existing guidelines.
The Models library does not impose a strict API, it only recommends one. In fact, you will only need to have the backend return a query instance (even bindings’ native one) and wrap the results in given model’s objects. See models.backends.tyrant for examples.
Usage
Not surprising to those who had ever used an ORM:
class Country(Model): name = Property(unicode) # any Python type will do; unicode is default def __unicode__(self): return self.name class Meta: must_have = {'type': 'country'} class Person(Model): first_name = Property(required=True) last_name = Property(required=True) gender = Property() birth_date = Date() birth_place = Property(Country) # reference to another model def __unicode__(self): return self.full_name # full_name is a dynamic attribute, see below @property def age(self): return (datetime.datetime.now().date() - self.birth_date).days / 365 @property def full_name(self): return '%s %s' % (self.first_name, self.last_name) class Meta: must_have = {'type': 'person'}
The interesting part is the Meta subclass. It contains a must_have attribute which actually binds the model to a subset of data in the storage. {'type':'person'} states that a data row/document/… must contain a type field with value person. You can easily define any other query conditions. If you create an empty Person instance, it will have all the “must haves” pre-filled.
Now let’s try these models with a Tokyo Tyrant database using Pyrant:
>>> from models.backends.tyrant import Storage >>> storage = Storage() >>> guido = Person.query(storage).filter(first_name='Guido')[0] >>> guido <Person Guido van Rossum> >>> guido.first_name Guido >>> guido.birth_date datetime.date(1960, 1, 31) >>> guido.age 49 >>> guido.birth_place = Country(name="Netherlands") >>> guido.save(storage) >>> guido.birth_place <Country Netherlands>
…and so on.
Note that relations are supported out of the box.
Licensing
Models is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Models is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with Models. If not, see <http://gnu.org/licenses/>.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file models-0.3.0.tar.gz
.
File metadata
- Download URL: models-0.3.0.tar.gz
- Upload date:
- Size: 11.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce0350c757e27dcf7476d9a3f030a3f408c0b318a6b1153a83db8206766fae10 |
|
MD5 | 9d5d84d63f876b079040c5843e924556 |
|
BLAKE2b-256 | fbdcfd2068f4cc4f275a1a2d41a2ca6a6b3a0d49c7e86ba3a30d2fbf15731f7a |