格式化 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