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

问题描述 投票:0回答:1

我正在开发一个 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中调用这个存储过程?

附注

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

python django postgresql psycopg2
1个回答
16
投票

我建议将过程定义存储在迁移文件中。 例如,在目录

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)
© www.soinside.com 2019 - 2024. All rights reserved.