格式化 psycopg2 创建的存储过程
Formatting stored procedures created by psycopg2
我对 psycopg2 和保存在 python 中的存储过程有点小问题,但这真的很烦人,我在网上找不到任何相关信息。
所以让我解释一下。整个事情按预期工作,过程被正确保存,调用时它工作,但是,当我想通过命令(“/ef”)在 postgres 数据库中检查它时,它是一行中的整个函数,它是真的很难读。
另一个问题是,当给定程序打印出一些错误或通知时,它每次都会说 "line 1",因为整个函数都在一行中。
有什么方法可以告诉 psycopg2 它应该创建新行吗?像“\n”或“\r”或其他任何东西..
示例:
Python 代码为:
import psycopg2
import psycopg2.extras
import psycopg2.extensions
query = ("CREATE OR REPLACE FUNCTION do_something() RETURNS void AS $$"
"DECLARE"
" something RECORD;"
" anything INTEGER;"
"BEGIN"
" FOR something IN SELECT thing FROM table LOOP"
" something := something + anything;"
" END LOOP;"
" RETURN"
"END"
"$$ LANGUAGE plpgsql;")
print "Connecting to DB.."
server_cx = psycopg2.connect(SERVER_DB_PATH)
server_cx.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
server_cu = server_cx.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
print "DB connection ok"
print "Inserting query"
server_cu.execute(query)
print "Query inserted! Exitting.."
但是当我把
\ef do_something()
进入 postgresql,我明白了:
CREATE OR REPLACE FUNCTION do_something() RETURNS void AS $$DECLARE something RECORD; anything INTEGER;BEGIN FOR something IN SELECT thing FROM table LOOP something := something + anything; END LOOP; RETURN;END;$$ LANGUAGE plpgsql;
而不是这个:
CREATE OR REPLACE FUNCTION do_something() RETURNS void AS $$
DECLARE
something RECORD;
anything INTEGER;
BEGIN
FOR something IN SELECT thing FROM table LOOP
something := something + anything;
END LOOP;
RETURN
END
$$ LANGUAGE plpgsql;
这真的会让我的生活更轻松、更快乐:)
你的问题是你在Python中输入的字符串没有换行,所以发送给PostgreSQL的程序也没有换行。
观察:
>>> mystring = ("blah "
... "blah")
>>> mystring
'blah blah'
您应该做的是在 Python:
中使用原始的三引号多行字符串
>>> mystring = r"""
... blah
... blah
... """
>>> mystring
'\nblah\nblah\n'
>>> print mystring
blah
blah
我对 psycopg2 和保存在 python 中的存储过程有点小问题,但这真的很烦人,我在网上找不到任何相关信息。
所以让我解释一下。整个事情按预期工作,过程被正确保存,调用时它工作,但是,当我想通过命令(“/ef”)在 postgres 数据库中检查它时,它是一行中的整个函数,它是真的很难读。
另一个问题是,当给定程序打印出一些错误或通知时,它每次都会说 "line 1",因为整个函数都在一行中。
有什么方法可以告诉 psycopg2 它应该创建新行吗?像“\n”或“\r”或其他任何东西..
示例:
Python 代码为:
import psycopg2
import psycopg2.extras
import psycopg2.extensions
query = ("CREATE OR REPLACE FUNCTION do_something() RETURNS void AS $$"
"DECLARE"
" something RECORD;"
" anything INTEGER;"
"BEGIN"
" FOR something IN SELECT thing FROM table LOOP"
" something := something + anything;"
" END LOOP;"
" RETURN"
"END"
"$$ LANGUAGE plpgsql;")
print "Connecting to DB.."
server_cx = psycopg2.connect(SERVER_DB_PATH)
server_cx.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
server_cu = server_cx.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
print "DB connection ok"
print "Inserting query"
server_cu.execute(query)
print "Query inserted! Exitting.."
但是当我把
\ef do_something()
进入 postgresql,我明白了:
CREATE OR REPLACE FUNCTION do_something() RETURNS void AS $$DECLARE something RECORD; anything INTEGER;BEGIN FOR something IN SELECT thing FROM table LOOP something := something + anything; END LOOP; RETURN;END;$$ LANGUAGE plpgsql;
而不是这个:
CREATE OR REPLACE FUNCTION do_something() RETURNS void AS $$
DECLARE
something RECORD;
anything INTEGER;
BEGIN
FOR something IN SELECT thing FROM table LOOP
something := something + anything;
END LOOP;
RETURN
END
$$ LANGUAGE plpgsql;
这真的会让我的生活更轻松、更快乐:)
你的问题是你在Python中输入的字符串没有换行,所以发送给PostgreSQL的程序也没有换行。
观察:
>>> mystring = ("blah "
... "blah")
>>> mystring
'blah blah'
您应该做的是在 Python:
中使用原始的三引号多行字符串>>> mystring = r"""
... blah
... blah
... """
>>> mystring
'\nblah\nblah\n'
>>> print mystring
blah
blah