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



我正在做一个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)]

注意:您需要将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)

最新更新