跳转到主要内容

Morepath中的Pony ORM集成

项目描述

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

more.pony:Morepath中的Pony ORM集成

此包为Pony对象关系映射库提供Morepath集成。

此包将数据库会话绑定到请求,您可以直接在App中与数据库交互,而无需使用db_session

快速入门

安装more.pony

$ pip install -U more.pony

从PonyApp扩展您的App类

from more.pony import PonyApp

class App(PonyApp):
    pass

创建您的模型

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()

在启动脚本中设置数据库

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())

现在您可以在路径中使用该模型

from .app import App
from .model import Document


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

并在您的视图中

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()

设置

您可以在设置的pony部分中设置传递给db_session的参数。

默认设置是

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

有关您在Pony API文档中找到的参数的更多信息。

您还可以使用数据库设置部分来设置数据库,这允许您为生产、开发和测试环境使用不同的设置。

只需为每个环境创建一个App并加载特定的设置文件

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)

根据您使用的数据库,YAML设置文件中的数据库配置可能如下所示

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

在您的启动脚本中,您根据RUN_ENV环境变量设置数据库并加载应用程序。

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)

有关数据库配置的详细信息,请参阅PonyOrm 文档

副作用

如果您想在数据库提交时触发副作用(如发送电子邮件或写入文件系统),您可以在视图的@request.after中发出信号,以触发副作用。

这样,副作用将在数据库会话提交之前触发,并且只有在未回滚的情况下才会触发。

此示例使用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)

或者,您可以在模型中使用PonyORM的after_insert()after_update()after_delete()实体钩子。这确保副作用在数据库会话提交后触发。

缺点是您在模型中没有轻松访问请求或应用程序。

变更

0.4 (2024-03-03)

  • 删除:取消对Python 3.4、3.5、3.6和3.7的支持。

  • 添加对Python 3.9、3.10和3.11的支持。

  • 修复Flake8。

  • 使用GitHub Actions进行CI。

  • 将Python 3.11作为默认测试环境。

  • 升级PonyORM到0.7.17。

  • 在测试输出中显示完整差异。

  • 添加编辑器配置和venv到.gitignore。

  • 删除报告到coveralls。

  • 更新预提交修订。

0.3 (2020-04-26)

  • 删除:删除对Python 2的支持。

    如果您想使用此版本,必须升级到Python 3。

  • 添加对Python 3.6、3.7和3.8以及PyPy 3.6的支持。

  • 将Python 3.7作为默认测试环境。

  • 升级PonyORM到0.7.13。

  • 添加对Black代码格式化器的集成。

0.2 (2017-07-20)

  • 升级PonyORM到0.7.2。

  • 在示例和测试中使用字典传递参数给db.bind。

0.1 (2017-04-22)

  • 首次公开发布。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

more.pony-0.4.tar.gz (7.9 kB 查看哈希)

上传时间 源代码

构建分发

more.pony-0.4-py2.py3-none-any.whl (6.9 kB 查看哈希)

上传时间 Python 2 Python 3

由以下提供支持