如何在Django项目中使用PostgreSQL的存储过程或函数
How to use PostgreSQL's stored procedures or functions in Django project
我正在处理一个 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)
我正在处理一个 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)