Package: ascetic
Ascetic exists as a super-lightweight datamapper ORM (Object-Relational Mapper) for Python.Home Page:https://bitbucket.org/emacsway/asceticDocs:https://ascetic.readthedocs.io/Browse source code (canonical repo):https://bitbucket.org/emacsway/ascetic/srcGitHub mirror:https://github.com/emacsway/asceticGet source code (canonical repo):git clonehttps://bitbucket.org/emacsway/ascetic.gitGet source code (mirror):git clonehttps://github.com/emacsway/ascetic.gitPyPI:https://pypi.python.org/pypi/asceticAscetic ORM based on “Data Mapper” pattern.
It also supports “Active Record” pattern, but only as a wrapper, the model class is fully free from any service logic.
Ascetic ORM follows theKISS principle.
Has automatic population of fields from database (see the example below) and minimal size.
You do not have to specify the columns in the class. This follows theDRYprinciple.
Ascetic ORM as small as possible.Inside ascetic.contrib (currently under development) you can find the next solutions:multilingualpolymorphic relationspolymorphic models (supports for “Single Table Inheritance”, “Concrete Table Inheritance” and “Class Table Inheritance” aka Django “Multi-table inheritance”)“Materialized Path” implementation to handle tree structuresversioning (which stores only diff, not content copy)All extensions support composite primary/foreign keys.“Identity Map” has SERIALIZABLE isolation level by default.What Ascetic ORM does not?
Ascetic ORM does not make any data type conversions (use connection features likethis), and does not has “Unit of Work”.
I recommend using aStorm ORM, if you need these features.Ascetic ORM is released under the MIT License (see LICENSE file for details).This project is currently under development, and not stable.
If you are looking for stable KISS-style ORM, pay attention toStorm ORM.PostgreSQL ExampleUsing these tables:CREATE TABLE ascetic_tests_models_author (
    id serial NOT NULL PRIMARY KEY,
    first_name VARCHAR(40) NOT NULL,
    last_name VARCHAR(40) NOT NULL,
    bio TEXT
);
CREATE TABLE books (
    id serial NOT NULL PRIMARY KEY,
    title VARCHAR(255),
    author_id integer REFERENCES ascetic_tests_models_author(id) ON DELETE CASCADE
);You can configure in one the following ways:1. Put in your PYTHONPATH file ascetic_settings.py with your settings.
See file ascetic/settings.py for more details.2. Define settings module in evironment variable ASCETIC_SETTINGS.3. Call ascetic.settings.configure(), for example:import ascetic.settings.configure
ascetic.settings.configure({
    'DATABASES': {
        'default': {
            'engine': "postgresql",
            'user': "devel",
            'database': "devel_ascetic",
            'password': "devel",
            'debug': True,
            'initial_sql': "SET NAMES 'UTF8';",
        }
    }
})We setup our objects like so:from ascetic.model import Model
from ascetic.mappers import get_mapper
from ascetic.relations import ForeignKey, OneToMany

class Author(Model):
    class Mapper(object):
        defaults = {'bio': 'No bio available'}
        validations = {'first_name': (
            lambda v: len(v) > 1 or "Too short first name",
            lambda self, key, value: value != self.last_name or "Please, enter another first name",
        )}

class Book(Model):
    author = ForeignKey(Author, related_name='books')

    class Mapper(object):
        db_table = 'books'Now we can create, retrieve, update and delete entries in our database.
Creationjames = Author(first_name='James', last_name='Joyce')
get_mapper(Author).save(james)  # Datamapper way

u = Book(title='Ulysses', author_id=james.id)
u.save()  # Use ActiveRecord wrapperRetrievala = Author.get(1)
a.first_name # James
a.books      # Returns list of author's books

# Returns a list, using LIMIT based on slice
a = Author.q[:10]   # LIMIT 0, 10
a = Author.q[20:30] # LIMIT 20, 10Updatinga = Author.get(1)
a.bio = 'What a crazy guy! Hard to read but... wow!'
a.save()Deletinga.delete()SQLBuilderintegrationobject_list = Book.q.tables(
    (Book.s & Author.s).on(Book.s.author_id == Author.s.id)
).where(
    (Author.s.first_name != 'James') & (Author.s.last_name != 'Joyce')
)[:10]Query object based onsqlbuilder.smartsql, seemore info.Signals supportpre_initpost_initpre_savepost_savepre_deletepost_deleteclass_preparedMore infoSee more info in docs:https://ascetic.readthedocs.io/WebYou can use Ascetic ORM with lightweight web-frameworks, likewheezy.web,Bottle,Tornado,pysi, etc.GratitudeForked fromhttps://github.com/lucky/autumnThanks toJared Kuolt (lucky)Other projectsSee also:Storm(properties from class) - excellent and simple ORM!Article (in English) “Why I prefer Storm ORM for Python”Article (in Russian) “Почему я выбираю Storm ORM для Python”Article (in English) “Implementation of Repository pattern for browser’s JavaScript”Article (in Russian) “Реализация паттерна Repository в браузерном JavaScript”SQLAlchemy(scheme from class or database, see “autoload” option)Openorm(lightweight datamapper),mirorSQLObject(scheme from class or database, see “fromDatabase” option)Peewee(scheme from class)Bazaar ORMTwistar(scheme from database), provides asynchronous DB interactionActivemodel(scheme from database)ActiveRecordlike ORM under 200 lines (scheme from database)A Query Language extension for Python: Query files, objects, SQL and NoSQL databases with a built-in query languagesimpleqlSQL table using nothing but Python to build the queryGenerator expressionsfor database requests (Python recipe)Object Relational Mappers (ORMs)