Skip to main content

Pony ORM integration in Morepath

Project description

CI Status https://img.shields.io/pypi/v/more.pony.svg https://img.shields.io/pypi/pyversions/more.pony.svg

more.pony: Pony ORM integration in Morepath

This package provides Morepath integration for the Pony Object-Relational Mapper library.

This package binds the database session to the request so you can interact with the database in your App directly without using db_session.

Quick start

Install more.pony:

$ pip install -U more.pony

Extend your App class from PonyApp:

from more.pony import PonyApp

class App(PonyApp):
    pass

Create your model:

from pony.orm import Database, PrimaryKey, Optional

db = Database()


class Document(db.Entity):
    _table_ = 'document'

    id = PrimaryKey(int, auto=True)
    title = Optional(str)
    content = Optional(str)

    def update(self, payload={}):
        self.set(**payload)

    def remove(self):
        self.delete()

Setup the database in your start script:

import morepath

from .app import App
from .model import db


def run():
    db.bind(provider='sqlite', filename='app.db', create_db=True)
    db.generate_mapping(create_tables=True)

    morepath.autoscan()
    morepath.run(App())

Now you can use the model in your path:

from .app import App
from .model import Document


@App.path(model=Document, path='documents/{id}')
def get_document(request, id=0):
    return Document[id]

And in your view:

from .app import App
from .model import Document


@App.json(model=Document)
def document_default(self, request):
    return {
        'id': self.id,
        'title': self.title,
        'content': self.content,
        'link': request.link(self)
    }


@App.json(model=Document, request_method='PUT')
def document_update(self, request):
    self.update(request.json)


@App.json(model=Document, request_method='DELETE')
def document_remove(self, request):
    self.remove()

Settings

You can set the arguments which are passed to db_session in the pony section of your settings.

The default settings are:

@App.setting_section(section='pony')
def get_pony_settings():
    return {
        'allowed_exceptions': [],
        'immediate': False,
        'retry': 0,
        'retry_exceptions': [TransactionError],
        'serializable': False,
        'strict': False
    }

More information about the arguments you find in the Pony API documentation.

You can also use the database settings section for your database setup, which allows you to use different setups for production, development and testing environments.

Just create create an App for each environment and load specific settings files:

class App(PonyApp):
    pass

with open('settings/default.yml') as defaults:
  defaults_dict = yaml.load(defaults)

App.init_settings(defaults_dict)


class ProductionApp(App):
    pass


with open('settings/production.yml') as settings:
    settings_dict = yaml.load(settings)

ProductionApp.init_settings(settings_dict)


class TestApp(App):
    pass


with open('settings/test.yml') as settings:
    settings_dict = yaml.load(settings)

TestApp.init_settings(settings_dict)

The database configuration in the YAML settings files, depending on the database you use, could look something like:

database:
  provider: sqlite
  filename: app.db
  create_db: true

In your start script you setup the database and load the App according to the RUN_ENV environment variable:

import os
import morepath

from .app import App, ProductionApp, TestApp
from .model import db


def setup_db(app):
    db_params = app.settings.database.__dict__.copy()
    db.bind(**db_params)
    db.generate_mapping(create_tables=True)

def run():
  morepath.autoscan()

  if os.getenv('RUN_ENV') == 'production':
      ProductionApp.commit()
      app = ProductionApp()
  elif os.getenv('RUN_ENV') == 'test':
      TestApp.commit()
      app = TestApp()
  else:
      App.commit()
      app = App()

  setup_db(app)
  morepath.run(app)

Detail about the database configuration you find in the PonyOrm documentation.

Side effects

If you want to trigger side effects (like sending an email or writing to filesystem) on database commits you can emit a signal in the @request.after of the view which triggers the side effects.

Like this the side effects will be triggered just before the database session gets committed and only if it wasn’t rolled back.

This example uses more.emit:

@App.json(model=Document, request_method='PUT')
def document_update(self, request):
    self.update(request.json)

    @request.after
    def after(response):
        request.app.signal.emit('document_updated', self, request)

Altenatively you can use in your model the PonyORM after_insert(), after_update() or after_delete() entity-hooks. This makes sure that the side effect is triggered after the database session has committed.

The drawback is that you don’t have easy access to the request or app in the model.

CHANGES

0.4 (2024-03-03)

  • Removed: Drop support for Python 3.4, 3.5, 3.6 and 3.7.

  • Add support for Python 3.9, 3.10 and 3.11.

  • Fix Flake8.

  • Use GitHub Actions for CI.

  • Make Python 3.11 the default testing environment.

  • Upgrade PonyORM to 0.7.17.

  • Show full diffs in the test output.

  • Add Editors config and venv to .gitignore.

  • Remove report to coveralls.

  • Update pre-commit revs.

0.3 (2020-04-26)

  • Removed: Removed support for Python 2.

    You have to upgrade to Python 3 if you want to use this version.

  • Added support for Python 3.6, 3.7 and 3.8 and PyPy 3.6.

  • Make Python 3.7 the default testing environment.

  • Upgrade PonyORM to 0.7.13.

  • Add integration for the Black code formatter.

0.2 (2017-07-20)

  • Upgrade PonyORM to 0.7.2.

  • Use a dictonary for passing parameters to db.bind in examples and tests.

0.1 (2017-04-22)

  • Initial public release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

more.pony-0.4.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

more.pony-0.4-py2.py3-none-any.whl (6.9 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file more.pony-0.4.tar.gz.

File metadata

  • Download URL: more.pony-0.4.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.2

File hashes

Hashes for more.pony-0.4.tar.gz
Algorithm Hash digest
SHA256 30afc39f83f3c701a451fd57a8f056f285df9824bff252cc6b0400a3358e7089
MD5 bc5e084cd66ddd33ab3a529eceab9cb6
BLAKE2b-256 fa739b16249dc197407a4bf4e55fb0f757fd2381cd95a5042b95cd882e40ff2d

See more details on using hashes here.

File details

Details for the file more.pony-0.4-py2.py3-none-any.whl.

File metadata

  • Download URL: more.pony-0.4-py2.py3-none-any.whl
  • Upload date:
  • Size: 6.9 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.2

File hashes

Hashes for more.pony-0.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 f5ecd1ff2afb1c228f0fcaf70e3618fc1b7b4ef34fd72f4ac806037befd86158
MD5 96a3fdcc01c6a22ef1891e6890539c87
BLAKE2b-256 f5924982114dd22c763dd7a9c2926ad3dd1f9d9a4bdd234fffbd742bb8ae3cee

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page