Morepath中的Pony ORM集成
项目描述
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)
首次公开发布。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建分发
更多.pony-0.4.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 30afc39f83f3c701a451fd57a8f056f285df9824bff252cc6b0400a3358e7089 |
|
MD5 | bc5e084cd66ddd33ab3a529eceab9cb6 |
|
BLAKE2b-256 | fa739b16249dc197407a4bf4e55fb0f757fd2381cd95a5042b95cd882e40ff2d |