python - 使用存储过程保持 ORM

标签 python mysql database stored-procedures sqlalchemy

我正在开发一个使用 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/

相关文章:

python - 如何在 python 中组合两个 numpy 数组元素?

php - 文件上传在本地主机上工作,但在服务器上发布后不起作用

mysql - 从命令行创建 MySQL 数据库

mysql - 在 MySQL 中选择多对多关系

SQL:如何在查询中使用 case 和 cast?

mysql - 识别关系会创建太多键?

python - 将高斯总和转化为快速 Numpy?

python - Slack 机器人,注册点击消息按钮

C# 声称我的 SQLite 表不存在,但它确实存在

python - py.test 中如何执行常见的设置和清除工作?