从Django调用Procedure时出错:没有与给定名称和参数类型匹配的过程

f4t66c6m  于 2023-05-30  发布在  Go
关注(0)|答案(1)|浏览(168)

我想通过Django后端调用安装在PostgreSQL数据库中的存储过程。
根据this stack question,为了从Django调用一个过程,我们必须在一个名为的文件中输入它:test.py,放在我们的迁移文件夹中,如下所示:

from django.db import migrations

SQL = """
CREATE OR REPLACE PROCEDURE get_input_file()
AS $$
 CREATE TABLE TEMP(RowData VARCHAR(4000));

$$
LANGUAGE SQL;
"""

class Migration(migrations.Migration):

    dependencies = [
        ('api', '0001_initial'),
    ]

    operations = [migrations.RunSQL(SQL)]

注:python test.py没有任何结果。
python manage.py migrate api导致

Operations to perform:
  Apply all migrations: api
Running migrations:
  No migrations to apply.

然后根据this guide,我们在后端www.example.com中添加views.py了以下代码:

# apply stored procedure
            import psycopg2
            import os
            conn = psycopg2.connect(
                host=os.getenv('TDB_HOST'),
                database=os.getenv('TDB_NAME'),
                user=os.getenv('TDB_USER'),
                password=os.getenv('TDB_PASSWORD')
            )
            cur = conn.cursor()
            cur.execute("CALL get_input_file();")
            conn.commit()

我们预期此测试将成功调用该过程。我们得到:

procedure get_input_file() does not exist
LINE 1: CALL get_input_file();
             ^
HINT:  No procedure matches the given name and argument types. You might need to add explicit type casts.
6fe3ivhb

6fe3ivhb1#

我通过以下步骤成功地解决了这个问题:
1.在数据库本身中创建过程(通过GUI PgAdmin)
1.使用psycopg2调用该过程:

call_script ='''CALL procedure();'''
cur.execute(call_script)

不需要迁移。不需要test.py文件。

相关问题