从Django调用Postgres SQL存储过程

Muh*_*aqi 5 python django postgresql stored-procedures

我正在使用Postgres SQL数据库进行Django项目。我编写了一个可以在Postgres上完美运行的存储过程。

现在,我想从Django 1.5中调用该存储过程。我已经编写了代码,但提示错误。

CREATE FUNCTION fn_save_message3(IN msg_sub character varying, IN msg_cont text, IN msg_type character varying, IN msg_category character varying, IN msg_created_by character varying, IN msg_updated_by character varying) RETURNS integer AS
$BODY$ DECLARE msg_id integer := 0;
BEGIN
    INSERT INTO tbl_messages
        (message_subject, message_content, message_type, message_category, 
       created_on, created_by, updated_on, updated_by)
    VALUES 
      (msg_sub, msg_cont, msg_type, msg_category, LOCALTIMESTAMP, 
       msg_created_by, LOCALTIMESTAMP, msg_updated_by);
      Select into msg_id currval('tbl_messages_message_id_seq');
  return msg_id;
END;$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
COST 100;
ALTER FUNCTION public.fn_save_message(IN character varying, IN text, IN character varying, IN character varying, IN character varying, IN character varying)
  OWNER TO gljsxdlvpgfvui;
Run Code Online (Sandbox Code Playgroud)

存储过程确定,并返回结果。

c = connection.cursor()
    try:
        c.execute("BEGIN")
        c.callproc("fn_save_message", [Message_Subject, Message_Content, Message_Type, Message_Category, Created_By, updated_by])
        results = c.fetchone()
        c.execute("COMMIT")
    finally:
        c.close()
    print results
Run Code Online (Sandbox Code Playgroud)

在您提出所有建议之后,我的程序终于可以运行了。但是还剩下一个小问题。

正如我以前用来results = c.fetchone()获取out参数。它返回(13,)

但是我只想获取13作为字符串或整数,如何只获取值。

更新:

用这个解决问题

for item in results:
        message_id = item
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 6

c = connection.cursor()
try:
    c.execute("BEGIN")
    c.callproc("fn_save_message3", (Message_Subject, Message_Content, Message_Type, Message_Category, Created_By, Updated_By))
    results = c.fetchall()
    c.execute("COMMIT")
finally:
    c.close()
print results
Run Code Online (Sandbox Code Playgroud)

您忘记了关闭括号并试图调用函数cursor而不是c并且还遇到了缩进问题。您还应该使用此处callproc()记录的功能

正如 catavaran 所说,您应该阅读有关执行自定义 SQL 和使用占位符的文档。此外,在 Django 1.6+ 中,事务是自动提交的,因此不需要c.execute("COMMIT")