在存储过程中保持ORM
我正在开发一个使用Python的网页应用,主要通过sqlalchemy来和mysql数据库进行沟通。到目前为止,我大部分时间都是用sqlalchemy的ORM层来和数据库交流。对我来说,ORM最大的好处就是开发速度快,不用写那么多的SQL查询语句,然后再把它们映射到模型上。
不过最近,我需要改变设计,通过存储过程来和数据库沟通。有没有人知道有没有办法用sqlalchemy的ORM层来通过存储过程和我的模型一起工作?或者有没有其他的Python库可以让我做到这一点?
我觉得我应该能自己写选择、插入、更新和删除的语句,把它们附加到模型上,然后让这个库来处理剩下的事情。我查阅了sqlalchemy的文档好几次,但就是找不到办法。
如果有人能帮忙,那就太好了!
1 个回答
SQLAlchemy没有很好的方法把插入、更新和删除操作转换成存储过程的调用。其实要在映射器上添加类似于instead_{update,insert,delete}的功能并不难,但目前还没有人去做。我觉得要求简单的数据库操作通过存储过程来执行有点傻,因为这并没有提供什么额外的功能,实际上用触发器就能做到。
如果你非要这么做,也有一些方法可以让SQLAlchemy配合使用。不过这样的话,你会失去一些ORM的功能。你可以通过使用query(Obj).from_statement(text("..."))来从存储过程的结果构建ORM对象,只要确保语句中的列标签和你告诉SQLAlchemy映射的列名一致就行。
应对数据库操作的一种方法是关闭自动刷新,然后通过会话中的.new、.dirty和.deleted属性来查看哪些对象发生了变化,发出相应的存储过程调用,并在提交之前清除这些对象。
或者,你也可以直接放弃SQLAlchemy的状态跟踪,直接调用存储过程。