我正在开发一个使用 sqlalchemy 与 mysql 数据库通信的 Python 网络应用程序。到目前为止,我主要使用 sqlalchemy 的 ORM 层与数据库对话。 ORM 给我的最大好处是开发速度,不必编写所有这些 sql 查询,然后将它们映射到模型。
然而,最近我被要求更改我的设计以通过存储过程与数据库通信。有谁知道是否有任何方法可以通过存储过程使用 sqlalchemy ORM 层来处理我的模型?是否有另一个 Python 库可以让我这样做?
在我看来,我应该能够编写自己的选择、插入、更新和删除语句,将它们附加到模型,然后让库完成剩下的工作。我已经多次浏览 sqlalchemy 的文档,但似乎找不到执行此操作的方法。
任何帮助都会很棒!
最佳答案
SQLAlchemy 没有任何好的方法可以将插入、更新和删除转换为存储过程调用。在映射器上添加具有 instead_{update,insert,delete} 扩展的功能可能并不难,但还没有人为此烦恼。我认为让简单的 DML 语句通过存储过程的要求相当愚蠢。它确实没有提供您无法使用触发器完成的任何事情。
如果您无法避免这种愚蠢行为,您可以通过一些方法使用 SQLAlchemy 来配合它。不过,您将失去一些 ORM 功能。您可以使用 query(Obj).from_statement(text("...")) 从存储过程结果构建 ORM 对象,只需让语句中的列标签与您告诉 SQLAlchemy 映射的列名称相匹配即可。
处理 DML 语句的一个选项是关闭自动刷新,而不是刷新 session .new、.dirty 和 .deleted 属性以查看发生了什么变化,将相应的语句作为存储过程调用发出,并在之前删除对象 promise 。
或者您可以放弃 SQLAlchemy 状态跟踪并直接发出存储过程调用。
关于python - 使用存储过程保持 ORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2330278/