Getting Started

Defining a database schema with PyDAL

from schemapy import DAL, Field


db = DAL('sqlite:memory')
db.define_table(
    'users',
    Field('name', type='string', required=True),
    Field('created_on', type='date')
)

db.define_table(
    'posts',
    Field('subject', type='string', required=True),
    Field('author', type='reference users', required=True),
    Field('created_on', type='date'),
    Field('content', type='text', required=True)
)

Using validators

Default validators are found in the schemapy.validators module.

Example:

def IS_OF(cls):
    def validator(value):
        if not isinstance(value, cls):
            return (value, 'wrong type')

        else:
            return (value, None)

    return validator


db.define_table(
    'persons',
    Field('name', type='string', requires=[IS_OF(str)], required=True),
    Field('age', type='integer', requires[IS_OF(int)], required=True)
)

Creating an API from a database

from schemapy import API


api = API(db)

CRUD methods are automatically created:

print(api.select_all_persons())
print(api.create_persons(name='john', age=12))
print(api.create_persons(name='bob', age='wrong'))  # will raise an error
print(api.update_persons(id=1, name='john smith'))
print(api.delete_persons(id=1))

Creating a custom API

@api.as_action(
    type='read',
    request=[
        Field('begin', type='date', required=True),
        Field('end', type='date', required=True)
    ],
    response=db.posts
)
def select_posts_by_date(db, req, action):
    query = (db.posts.created_on >= req.begin) | (db.posts.created_on <= req.end)
    return db(query).select()

Usage:

now = datetime.now()
result = api.select_posts_by_date(
    begin=now - timedelta(days=1),
    end=now
)
print(list(result))