我正在使用 python 构建 Django 应用程序,该应用程序预计会接收大量数据,我已经研究了一些可以提高性能的 PL/PGSQL 程序。这些过程存储在文件中,我不想在数据库上创建它们。
我只想能够使用 postgresql_psycopg2 执行它们,另一个棘手的部分是我希望能够在执行之前更改文件中的某些参数,但不确定如何处理它。
这是我的 Python 代码
pg_script = os.path.join(getattr(settings, 'BASE_DIR'),'myapp/apps/rating/sql/rating_create_article_rating.sql')
cursor = connection.cursor()
cursor.execute("run script %s" % pg_script)
这是 rating_create_article_rating.sql
DECLARE
article_rec publication_article%ROWTYPE;
user_rec auth_user%ROWTYPE;
up integer := 1;
down integer := -1;
l_counter integer := 0; -- local counter
cnt integer;
p_content_type_id integer;
BEGIN
LOOP
-- RANDOM ARTICLE
SELECT *
INTO article_rec
FROM publication_article
order by random()
LIMIT 1;
-- RANDOM USER
SELECT *
INTO user_rec
FROM auth_user
order by random()
LIMIT 1;
BEGIN
INSERT INTO rating_rate (rated_by_id, rated_at, content_type_id, object_id, rate, language)
VALUES (user_rec.id, now(), p_content_type_id, article_rec.id, 1, 'en');
l_counter := l_counter+1;
EXCEPTION
WHEN unique_violation THEN
END;
EXIT WHEN l_counter>cnt;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
当我将上面的代码作为存储函数执行时,上面的代码有效,否则运行脚本不起作用,我收到以下错误
ERROR: syntax error at or near "run" at character 1
STATEMENT: run script /Users/mo/Projects/pythonic/myapp-env/myapp/myapp/apps/rating/sql/rating_create_article_rating.sql
我还想知道是否有办法将参数传递给文件并从 pl/pgsql 处理它?
非常感谢