在SQLalchemy中使用参数调用函数

时间:2018-07-02 16:07:44

标签: python postgresql sqlalchemy

我正在尝试使用SQLAlchemy从python调用PostGreSQL函数:该函数看起来像:

CREATE OR REPLACE FUNCTION insert_all(ID1 VARCHAR(20), ID2 VARCHAR(20),
trans_00 VARCHAR(1000), trans_1G VARCHAR(1000), trans_1S VARCHAR(1000),
cont VARCHAR(1000), fr VARCHAR(1000), hasmod VARCHAR(1), act_ch FLOAT,
cat_ch VARCHAR(2), count INT RETURNS void AS $$
...
END;
$$ LANGUAGE plpgsql;

在python中,我尝试过:

_upload={'ID1':linesplit[0], 'ID2':linesplit[1], 'trans_00':linesplit[2],
'trans_1G':linesplit[3], 'trans_1S':linesplit[4],
'cont':linesplit[5], 'fr':linesplit[6], 'hasmod':linesplit[7],
'act_ch':linesplit[8], 'cat_ch':linesplit[9], 'count':linesplit[10]}

a=self.connection.execute(sqlalchemy.text('select
insert_all(:ID1, :ID2, :trans_00, :trans_1G, :trans_1S, :cont, :fr,
:hasmod, :act_ch, :cat_ch, :count) from dual'), _upload)

我得到的错误:

sqlalchemy.exc.InvalidRequestError: A value is required for bind parameter '1' (Background on this error at: http://sqlalche.me/e/cd3x)

您是否认为可以进行批量插入(而不是使用_upload={...}_upload.append({...})一次插入更多行)?

1 个答案:

答案 0 :(得分:-1)

您是否尝试过使用sqlalchemy中的func方法。它对我有用:

from sqlalchemy.sql.expression import func

a = session.execute(func.your_schema.insert_all(*_upload.values()))