gpt4 book ai didi

python - psycopg2 - 具有多个未提交的插入语句的函数

转载 作者:行者123 更新时间:2023-11-29 13:55:13 25 4
gpt4 key购买 nike

我有以下带有 2 个插入语句的 PosgreSQL 函数:

CREATE OR REPLACE FUNCTION create_user(
_username character varying,
_email character varying,
_password character varying,
_first_name character varying,
_middle_initial character,
_last_name character varying,
_title character varying,
_enabled boolean,
_company_id integer,
_created_by integer,
_superuser boolean)
RETURNS UserAccount AS
$BODY$DECLARE
result UserAccount;
BEGIN
INSERT INTO UserAccount
(username, email, password, first_name, middle_initial,
last_name, title, enabled, created_by, superuser)
VALUES (_username, _email, _password, _first_name,_middle_initial,
_last_name, _title, _enabled, _created_by, _superuser)
RETURNING * INTO result;

INSERT INTO UserCompany (user_id, company_id)
VALUES (result.id, _company_id);

RETURN result;
END;$BODY$
LANGUAGE plpgsql VOLATILE STRICT;

通过 PGAdmin 执行 SELECT * FROM create_user(..._) 按预期工作并返回新的 UserAccount 行。

我的Python代码如下:

conn = psycopg2.connect(app.config.get('POSTGRES_URI'))
cursor = conn.cursor()

# Some prep of variables...

cursor.execute("""
SELECT
id, username, email, first_name, middle_initial, last_name, last_login, title, failed_attempts, enabled, created_by, superuser
FROM create_user(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", (
username, email, str(hashed_password), first_name, middle_initial, last_name,
title, enabled, company_id, created_by, superuser
))

conn.commit()

user = dict(zip([x[0] for x in g.db.description], g.db.fetchone()))

cursor.close()
conn.close()

return user

这将返回值的所有空值并且不提交插入。如果我从函数中删除第二个 INSERT 语句,它会按预期工作。我试过 conn.autocommit = Trueconn.set_isolation_level(0) 和使用 cursor.callproc(...) 方法。还是不行。我是否遗漏了什么,或者这是 psycopg2 现在的问题吗?

编辑 - 解决方案(facepalm):

我发现问题出在函数的 STRICT 子句上。与 pscyopg2 无关。现在问这个问题感觉很糟糕。我向函数传递了一个空值,当然,当传递空值时,这就是 STRICT 的意思……什么都没有。

最佳答案

您不应在 Python 脚本中提交 select 语句。提交应该发生在您的 PosgreSQL 函数中。尝试提交;在 RETURN 行上方。

关于python - psycopg2 - 具有多个未提交的插入语句的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33574069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com