从 Django 调用 Postgres SQL 存储过程
Call Postgres SQL stored procedure From Django
我正在使用 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;
存储过程正常,returns 结果。
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
经过您的建议,我的程序终于可以运行了。但还有一个小问题。
因为我已经使用 results = c.fetchone()
来获取输出参数。
它 returns (13,)
但我只想获取 13 作为字符串或整数,我怎样才能只获取值。
更新:
问题用这个解决了
for item in results:
message_id = item
c.execute("SELECT fn_save_message3(...
行缺少右括号。在最后一个引号后添加 )
。
但无论如何,从 python 代码执行 SQL 的方法是错误的。您应该使用占位符来防止 sql 注入攻击。 Read the documentation 以及在 django 中正确使用 SQL 的示例。
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
您忘记了右括号并试图在 cursor
而不是 c
上调用函数,并且还有缩进问题。您还应该使用 callproc()
函数作为记录 here.
正如 catavaran 所说,您应该阅读有关执行自定义 SQL 和使用占位符的文档。此外,在 Django 1.6+ 中,事务是自动提交的,因此不需要 c.execute("COMMIT")
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.fetchone()
c.execute("COMMIT")
finally:
c.close()
for item in results:
message_id = item
我正在使用 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;
存储过程正常,returns 结果。
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
经过您的建议,我的程序终于可以运行了。但还有一个小问题。
因为我已经使用 results = c.fetchone()
来获取输出参数。
它 returns (13,)
但我只想获取 13 作为字符串或整数,我怎样才能只获取值。
更新:
问题用这个解决了
for item in results:
message_id = item
c.execute("SELECT fn_save_message3(...
行缺少右括号。在最后一个引号后添加 )
。
但无论如何,从 python 代码执行 SQL 的方法是错误的。您应该使用占位符来防止 sql 注入攻击。 Read the documentation 以及在 django 中正确使用 SQL 的示例。
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
您忘记了右括号并试图在 cursor
而不是 c
上调用函数,并且还有缩进问题。您还应该使用 callproc()
函数作为记录 here.
正如 catavaran 所说,您应该阅读有关执行自定义 SQL 和使用占位符的文档。此外,在 Django 1.6+ 中,事务是自动提交的,因此不需要 c.execute("COMMIT")
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.fetchone()
c.execute("COMMIT")
finally:
c.close()
for item in results:
message_id = item