【发布时间】:2019-04-04 14:04:46
【问题描述】:
我使用 SQLAlchemy Engine 创建了一些函数和触发器,但我不想混合使用 Python 和 SQL,所以我为我的 SQL 语句创建了一个单独的文件,我读取了内容并将其传递给 engine.execute()。它不会抛出任何错误,但是函数不是在数据库中创建的,但是如果我通过 pgAdmin 运行相同的 SQL 文件,一切正常。
我的 SQL 文件:
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'plpython3u') THEN
CREATE EXTENSION plpython3u;
END IF;
END;
$$;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_proc WHERE proname = 'my_func') THEN
CREATE FUNCTION public.my_func() RETURNS TRIGGER LANGUAGE 'plpython3u' NOT LEAKPROOF AS $BODY$
-- definition
$BODY$;
GRANT EXECUTE ON FUNCTION my_func() TO public;
END IF;
END;
$$;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_proc WHERE proname = 'my_func2') THEN
CREATE FUNCTION public.my_func2() RETURNS TRIGGER LANGUAGE 'plpython3u' NOT LEAKPROOF AS $BODY$
-- definition
$BODY$;
GRANT EXECUTE ON FUNCTION my_func2() TO public;
END IF;
END;
$$;
我按如下方式运行:
def execute_sql_file(engine, path):
try:
with open(path) as file:
engine.execute(file.read())
except ProgrammingError:
raise MyCustomError
except FileNotFoundError:
raise MyCustomError
如果我在没有超级用户权限的情况下运行它,它会按预期抛出ProgrammingError。据我了解END; 提交了事务,所以这段代码真的运行了,这些函数应该可供公众使用,但它们甚至没有被创建。欢迎任何想法,谢谢!
【问题讨论】:
标签: python postgresql sqlalchemy