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

9

我正在开发一个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中真的找不到任何解决办法。

1个回答

14

我建议将过程定义存储在迁移文件中。例如,可以在目录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)]
注意:您需要使用您应用程序的名称替换myapp,并且您需要仅将最近的迁移文件作为依赖项包含在您的应用程序中。

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


一旦您的过程在数据库中被定义,您就可以使用cursor.callproc来调用它:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接