psycopg2函数有多个insert语句未提交

2024-09-28 22:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下带有2个insert语句的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代码如下:

^{pr2}$

这将返回值的所有空值,而不提交插入。如果我从函数中删除第二个INSERT语句,它将按预期工作。我尝试过conn.autocommit = Trueconn.set_isolation_level(0),并使用cursor.callproc(…)方法。还是不行。我是错过了什么,还是这是精神病的问题?在

编辑-解决方案(facepalm):

我发现问题出在函数的严格从句上。与pscyopg2无关。现在问这个问题真丢人。我给函数传递了一个空值,当然,这就是STRICT在传递null时要做的事情。。。没有什么。在


Tags: 函数nameidmiddleemailusernamepasswordresult
3条回答

您不应该在Python脚本中提交select语句。提交应该发生在PosgreSQL函数中。尝试抛出一个提交;超出返回线。在

为我工作:

create table UserAccount (
    id serial primary key, username text
);
create table UserCompany (
    user_id integer primary key,
    company_id integer
);
create or replace function create_user(
    _username character varying,
    _company_id integer
) returns UserAccount as $body$
declare
    result UserAccount;
begin
    insert into UserAccount (username)
    values (_username)
    returning * into result;

    insert into UserCompany (user_id, company_id)
    values (result.id, _company_id);

    return result;
end;
$body$ language plpgsql volatile strict;

Python代码

^{pr2}$

退货

^{3}$

解决方案(facepalm):

我发现问题出在函数的严格从句上。与pscyopg2无关。现在问这个问题真丢人。我给函数传递了一个空值,当然,这就是STRICT在传递null时要做的事情。。。没有什么。在

相关问题 更多 >