如何在Django项目中使用PostgreSQL的存储过程或函数

2024-05-18

我正在开发一个 Django 项目。我决定在 PostgreSQL 中编写逻辑代码,而不是用 Python 编写。因此,我在 PostgreSQL 中创建了一个存储过程。例如,存储过程如下所示:

create or replace procedure close_credit(id_loan int)
language plpgsql
as $$
begin
    update public.loan_loan
    set sum = 0
    where id = id_loan;
    commit;
end;$$

然后在settings.py中,我做了以下更改:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'pawnshop',
        'USER': 'admin',
        'PASSWORD': password.database_password,
        'HOST': 'localhost',
        'PORT': '',
    }
}

那么问题来了,如何在views.py中调用这个存储过程呢?

p.s.

也许这听起来像是一个愚蠢的问题,但我确实在 Django 中找不到任何解决方案。


我建议将过程定义存储在迁移文件中。例如,在目录中myapp/migrations/sql.py:

from django.db import migrations

SQL = """
create procedure close_credit(id_loan int)
language plpgsql
as $$
begin
    update public.loan_loan
    set sum = 0
    where id = id_loan;
    commit;
end;$$
"""

class Migration(migrations.Migration):
    
    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [migrations.RunSQL(SQL)]

Note: 你需要更换myapp与您的应用程序的名称,并且您需要包括only the 最近的您的应用程序的迁移文件作为依赖项。

现在您可以使用安装该过程python3 manage.py migrate.


在数据库中定义过程后,您可以使用以下命令调用它cursor.callproc https://docs.djangoproject.com/en/3.2/topics/db/sql/#calling-stored-procedures:

from django.db import connection

def close_credit(id_loan):
    with connection.cursor() as cursor:
        cursor.callproc('close_credit', [id_loan])

话虽这么说,如果您的程序确实像您提供的示例一样简单,那么使用以下代码编写等效程序的维护成本会少得多ORM:

Loan.objects.filter(id=id_loan).update(sum=0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Django项目中使用PostgreSQL的存储过程或函数 的相关文章

随机推荐

  • 如何通过减少请求来改进 AJAX 实时搜索

    我正在构建一个 AJAX 实时搜索页面 到目前为止 一切都按预期运行 但我注意到我正在进行大量的 AJAX 调用 我知道发生这种情况的地点和原因 但我找不到阻止这些 AJAX 调用发生的方法 我将尝试给出快速解释 然后粘贴下面的代码 在页面
  • Java Web 技术中的 AJAX 自动完成文本框(JSP 和 servlet)

    我需要您的帮助 了解如何使用 Java Web 技术 JSP Servlet 和 AJAX 使 HTML 输入文本元素像 Google 的 AJAX 搜索引擎 输入文本元素一样工作 下拉列表中的数据将来自数据库表 例如分别是 MySQL 或
  • 限制对记录的访问。基于声明的权限是个好主意吗

    在 net 基于声明的身份框架中 如果我想限制用户对某个帐户 特定帐户 123456 执行操作 查看或编辑 我说的是商业实体 例如银行帐户 创建索赔是个好主意吗对于他们可以查看或编辑的每个帐户 一组中有很多索赔有什么缺点吗 系统管理员可能有
  • Python 非贪婪正则表达式

    我如何制作一个像这样的Python正则表达式 这样 给定 a b c d e 蟒蛇匹配 b 代替 b c d 我知道我可以使用 代替 但我正在寻找一种更通用的解决方案 使我的正则表达式更加干净 有没有办法告诉python 嘿 尽快匹配这个
  • 使用组合 API 和 TypeScript 类型系统强类型化 vue 组件的 props

    我正在使用 vue 组合 api 和 typescript 如何使用打字稿输入系统强类型化组件属性 特洛伊 凯西尔的回答并不完全准确 我引用的文档definecomponent https vue composition api rfc n
  • IE 7 兼容模式中的 JQuery Unobtrusive 验证导致带有表单的页面出现“Member Not Found”错误

    最近 我在 Internet Explorer 中查看我的网站时注意到 JQuery 错误 该错误是源自 JQuery 源的 未找到成员 错误 我注意到单击了兼容模式按钮 取消单击此按钮修复了错误 但我不能假设我的网站的用户会如此乐于助人
  • 如何从嵌套的对象数组中获取每个父级的值

    所以我有多个对象数组 每个对象都包含一个子对象 e g const data id 1 name parent 1 children id c1 name child 1 children id g1 name grand 1 childr
  • Selenium 与 scrapy 的动态页面

    我正在尝试使用 scrapy 从网页中抓取产品信息 我要抓取的网页如下所示 从包含 10 个产品的 Product list 页面开始 单击 下一步 按钮将加载接下来的 10 个产品 两个页面之间的 URL 不会改变 我使用 LinkExt
  • 如何使用文件输入在PDFJS中打开本地PDF?

    我想知道是否有办法使用选择pdf文件input type file 并使用打开它PDFJS https github com mozilla pdf js 您应该能够使用 FileReader 来获取文件对象的内容作为类型化数组 pdfjs
  • 捕获特定的 WebException (550)

    假设我创建并执行一个System Net FtpWebRequest 我可以用catch WebException ex 捕获此请求引发的任何与 Web 相关的异常 但是 如果我有一些逻辑只想在由于以下原因引发异常时执行 550 file
  • 如何限制 python 回溯到特定文件

    我编写了大量使用外部库的 Python 代码 我经常会编写一个错误 当我运行代码时 我会在 Python 控制台中看到一个很长的回溯 99 999999 的情况是由于我的代码中的编码错误 而不是由于包中的错误 但是回溯一直到包代码中的错误行
  • IE8 中字符串的 indexOf 的替代函数是什么?

    我用过indexOf检查句子中是否存在特定文本 如下所示 var temp temp data not available if temp indexOf datas 0 alert True else alert false 我面临的问题
  • 调试自定义 Kafka 连接器的简单有效的方法是什么?

    我正在使用几个 Kafka 连接器 在控制台输出中没有看到它们的创建 部署有任何错误 但是我没有得到我正在寻找的结果 没有任何结果 无论是期望的还是否则 我基于 Kafka 的示例 FileStream 连接器制作了这些连接器 因此我的调试
  • 如何防止Apple Watch进入睡眠状态?

    我们正在开发一个 Apple Watch 项目 但如果不被打扰 手表就会进入睡眠状态 有什么办法可以阻止它进入睡眠状态吗 据我所知和有关该主题的其他搜索 目前还没有api可通过编程方式启用或禁用 Apple Watch 的睡眠模式
  • 渲染ejs模板

    我在nodejs中有以下代码 我读取temp ejs文件并获取ejsHtml作为字符串的内容 var html EJS render ejsHtml A div smth div 在 temp ejs 中 Output
  • rsync 可以支持一对多同步吗?

    我可以在数百个网站上同步我所工作的 模型 网站的更改吗在同一台服务器上 using rsync 我会更新通用模板文件和 JS 脚本 如果可能的话我该如何设置 我在 Hostgator 专用服务器上 运行 Apache 请阅读我对下面已编辑问
  • 为什么在为 Silverlight 5 应用程序添加编码 UI 支持时 System.Core 无法加载?

    我遇到以下问题 尝试添加对为 Silverlight 5 应用程序创建编码 UI 测试的支持 MSDN 1 第一步是在 Silverlight 5 项目中引用程序集 Microsoft VisualStudio TestTools UITe
  • 如何添加链接以从我的 R闪亮应用程序在新窗口中打开 pdf 文件?

    我可以使用 a 从我的 Shiny 应用程序添加到外部站点的超链接 a google href http www google com 但如何创建一个链接来打开 pdf 或类似 文件 看起来应该很简单 但我找不到任何例子 我的问题与此类似
  • 需要使用手机后退按钮返回 Web 视图的帮助

    这是我的代码 package com testappmobile import android app Activity import android os Bundle import android view KeyEvent impor
  • 如何在Django项目中使用PostgreSQL的存储过程或函数

    我正在开发一个 Django 项目 我决定在 PostgreSQL 中编写逻辑代码 而不是用 Python 编写 因此 我在 PostgreSQL 中创建了一个存储过程 例如 存储过程如下所示 create or replace proce