morepath中的小型orm集成
more.pon的Python项目详细描述
more.pony:morepath中的小马orm集成
此包为Pony提供了更多路径集成 对象关系映射程序库。
此包将数据库会话绑定到请求,以便 您可以直接与应用程序中的数据库交互 不使用db_session。
快速启动
安装more.pony:
$ pip install -U more.pony
从Ponyapp扩展应用程序类:
frommore.ponyimportPonyAppclassApp(PonyApp):pass
创建您的模型:
frompony.ormimportDatabase,PrimaryKey,Optionaldb=Database()classDocument(db.Entity):_table_='document'id=PrimaryKey(int,auto=True)title=Optional(str)content=Optional(str)defupdate(self,payload={}):self.set(**payload)defremove(self):self.delete()
在开始脚本中设置数据库:
importmorepathfrom.appimportAppfrom.modelimportdbdefrun():db.bind(provider='sqlite',filename='app.db',create_db=True)db.generate_mapping(create_tables=True)morepath.autoscan()morepath.run(App())
现在您可以在您的路径中使用该模型:
from.appimportAppfrom.modelimportDocument@App.path(model=Document,path='documents/{id}')defget_document(request,id=0):returnDocument[id]
在您看来:
from.appimportAppfrom.modelimportDocument@App.json(model=Document)defdocument_default(self,request):return{'id':self.id,'title':self.title,'content':self.content,'link':request.link(self)}@App.json(model=Document,request_method='PUT')defdocument_update(self,request):self.update(request.json)@App.json(model=Document,request_method='DELETE')defdocument_remove(self,request):self.remove()
设置
您可以设置传递给^{tt1}的参数$ 在设置的pony部分。
默认设置为:
@App.setting_section(section='pony')defget_pony_settings():return{'allowed_exceptions':[],'immediate':False,'retry':0,'retry_exceptions':[TransactionError],'serializable':False,'strict':False}
有关在Pony API documentation中找到的参数的详细信息。
您还可以使用databasesettings部分进行数据库设置, 它允许您使用不同的设置进行生产、开发和 测试环境。
只需为每个环境创建一个应用程序并加载特定的 设置文件:
classApp(PonyApp):passwithopen('settings/default.yml')asdefaults:defaults_dict=yaml.load(defaults)App.init_settings(defaults_dict)classProductionApp(App):passwithopen('settings/production.yml')assettings:settings_dict=yaml.load(settings)ProductionApp.init_settings(settings_dict)classTestApp(App):passwithopen('settings/test.yml')assettings:settings_dict=yaml.load(settings)TestApp.init_settings(settings_dict)
yaml设置中的数据库配置 根据使用的数据库,文件可以 看起来像:
database:provider:sqlitefilename:app.dbcreate_db:true
在开始脚本中,设置数据库并加载 根据RUN_ENV环境变量的应用程序:
importosimportmorepathfrom.appimportApp,ProductionApp,TestAppfrom.modelimportdbdefsetup_db(app):db_params=app.settings.database.__dict__.copy()db.bind(**db_params)db.generate_mapping(create_tables=True)defrun():morepath.autoscan()ifos.getenv('RUN_ENV')=='production':ProductionApp.commit()app=ProductionApp()elifos.getenv('RUN_ENV')=='test':TestApp.commit()app=TestApp()else:App.commit()app=App()setup_db(app)morepath.run(app)
有关找到的数据库配置的详细信息 在PonyOrm documentation中。
副作用
如果你想引发副作用(如发送电子邮件或 在数据库提交时,您可以发出一个信号 在引发副作用的视图的@request.after中。
像这样的副作用会在 只有当数据库会话没有回滚时,它才会被提交。
此示例使用more.emit:
@App.json(model=Document,request_method='PUT')defdocument_update(self,request):self.update(request.json)@request.afterdefafter(response):request.app.signal.emit('document_updated',self,request)
另外,你也可以在你的模型中使用Ponyorm after_insert()、after_update()或after_delete() 实体挂钩。 这样可以确保触发副作用 在数据库会话提交之后。
缺点是你不容易接近 模型中的请求或应用程序。
更改
0.2(2017-07-20)
- 升级ponyorm至0.7.2。
- 在示例和测试中,使用听写将参数传递给db.bind。
0.1(2017-04-22)
- 首次公开发行。