将ORM与存储过程保持一致

时间:2010-02-24 22:51:05

标签: python mysql database stored-procedures sqlalchemy

我正在使用sqlalchemy开发一个Python Web应用程序来与mysql数据库进行通信。到目前为止,我主要使用sqlalchemy的ORM层与数据库对话。 ORM给我带来的最大好处是开发速度,不必编写所有这些SQL查询,然后将它们映射到模型。

但是,最近我被要求更改我的设计以通过存储过程与数据库进行通信。有没有人知道是否有任何方法可以使用sqlalchemy ORM层通过存储过程处理我的模型?还有另一个允许我这样做的Python库吗?

我看到它的方式我应该能够编写自己的select,insert,update和delete语句,将它们附加到模型中,让库完成其余的工作。我已多次浏览sqlalchemy的文档,但似乎无法找到方法。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:3)

SQLAlchemy没有任何好的方法可以将插入,更新和删除转换为存储过程调用。添加在映射器上具有instead_ {update,insert,delete}扩展的功能可能不会那么难,但还没有人感到困扰。我认为要求简单的DML语句通过存储过程相当愚蠢。它确实没有提供任何你用触发器无法做到的事情。

如果你无法避免愚蠢,有一些方法可以使用SQLAlchemy来配合它。但是你会失去一些ORM功能。您可以使用查询(Obj).from_statement(text(“...”))从存储过程结果构建ORM对象,只需让语句中的列标签与您告诉SQLAlchemy映射的列名匹配。

处理DML语句的一个选项是关闭autoflush而不是刷新遍历会话.new,.dirty和.deleted属性以查看已更改的内容,发出相应的语句作为存储过程调用并在之前清除对象犯。

或者您可以放弃SQLAlchemy状态跟踪并直接发出存储过程调用。

相关问题