功能我有2插入語句如下PosgreSQL功能:psycopg2 - 具有多重插入語句不commiting
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;
執行SELECT * FROM create_user(..._)
通過pgAdmin的工作正常,並返回新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 = True
,conn.set_isolation_level(0)
,並使用cursor.callproc(...)方法。仍然不起作用。我是否錯過了某些東西,或者現在是psycopg2的問題嗎?
編輯 - 解決方案(捂臉):
我發現這個問題是在功能上嚴格的條款。與pscyopg2無關。感覺現在就問這個問題。我向函數傳遞了一個空值,當然,這就是STRICT在空值傳遞時的意思......沒有任何東西。
添加提交到功能後,我仍然得到同樣的結果。 –