2015-11-06 11 views
1

功能我有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在空值傳遞時的意思......沒有任何東西。

回答

0

你不應該在你的Python腳本中提交你的select語句。提交應該發生在你的PosgreSQL函數中。嘗試拋出一個提交;在RETURN行之上。

+0

添加提交到功能後,我仍然得到同樣的結果。 –

0

解決方案(捂臉):

我發現這個問題是在功能上嚴格的條款。與pscyopg2無關。感覺現在就問這個問題。我向函數傳遞了一個空值,當然,這就是STRICT在空值傳遞時的意思......沒有任何東西。

0

工作對我來說:

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代碼

from psycopg2 import connect 
con = connect('dbname=cpn') 
curs = con.cursor() 
curs.execute(''' 
    select * from create_user(%s, %s); 
''', ('john', 2)) 
con.commit() 
user = curs.fetchone() 
print user 
con.close() 

返回

(2, 'john')