回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有以下带有2个insert语句的PosgreSQL函数:</p>
<pre><code>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;
</code></pre>
<p>通过PGAdmin执行<code>SELECT * FROM create_user(..._)</code>与预期一样工作,并返回新的UserAccount行。在</p>
<p>我的Python代码如下:</p>
^{pr2}$
<p>这将返回值的所有空值,而不提交插入。如果我从函数中删除第二个INSERT语句,它将按预期工作。我尝试过<code>conn.autocommit = True</code>,<code>conn.set_isolation_level(0)</code>,并使用cursor.callproc(…)方法。还是不行。我是错过了什么,还是这是精神病的问题?在</p>
<p>编辑-解决方案(facepalm):</p>
<p>我发现问题出在函数的严格从句上。与pscyopg2无关。现在问这个问题真丢人。我给函数传递了一个空值,当然,这就是STRICT在传递null时要做的事情。。。没有什么。在</p>