gpt4 book ai didi

python - 如何通过调用 Postgres 函数插​​入记录时提交

转载 作者:行者123 更新时间:2023-11-29 12:54:04 25 4
gpt4 key购买 nike

我写了一个函数来将记录插入表 person。 Row ID 是连续的(自增)

CREATE OR REPLACE FUNCTION public.add_person(
name character varying,
email character varying,
level integer,
company_id integer,
comp_list integer[])
RETURNS integer as

$BODY$
declare
p_id integer;
begin
insert into person (name, email, level, company_id, comp_list, status, insert_ts) values ($1, $2, $3, $4, $5, 'Y', now())
returning person.person_id into p_id;
return p_id;
end
$BODY$ LANGUAGE 'plpgsql'

如果我用 sql select * from add_person('xxx', 'xxx@gmail.com', 1, 3, '{1,2}') 运行这个函数,它会插入一个记录成功。但是,当我使用 SQLAlchemy 在 Python 中调用此函数时,无法插入记录。

engine = create_engine(URL(**settings.DATABASE))
session = scoped_session(sessionmaker(bind=engine))
email = 'xxx@gmail.com'
company = 1
level = 3
comp_list = '1,2'
args = "'', '" + email + "', " + str(company) + ", " + str(level) + ", '{" + comp_list + "}'"
statement = "select * from add_person({})".format(args)
session.execute(statement)

用Python构造的语句和我在postgres中运行的命令完全一样。但是它没有像预期的那样将记录插入表中。完全没有错误信息。 sessionengine 已正确配置,因为所有其他 select 查询都有效。

我还注意到,即使无法使用 python 代码插入记录。主键的顺序确实增加了。因为当我在 postgres 中再次运行该函数时,行 ID 被跳过了。

如果我在没有提交的情况下使用 SQLAlchemy session 进行插入,行为是相同的。

def add_person(name, email, company, level, comp_list):
current_ts = datetime.datetime.now()
p = Person(name = name,
email = email,
company_id = company,
level = level,
comp_list = comp_list,
status = 'Y',
insert_ts = current_ts)
session.add(p)
session.flush()
return p.person_id

如果我运行上面的 Python 方法,person_id 递增但没有插入记录。只有当我将 session.flush 更改为以下内容时,记录才会正确插入。

    session.add(p)
session.commit()
session.refresh(p)
print(p.person_id)
return p.person_id

调用 plsql 函数时提交插入的正确方法是什么?

最佳答案

除非你有 autocommit在连接上设置为 True你需要调用commit() session 的功能。

文档:http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#when-do-i-construct-a-session-when-do-i-commit-it-and-when-do-i-close-it


你的原因person_id即使没有提交也是递增的,因为它使用的是一个序列——要么是您明确创建的,要么是在您将列类型定义为 SERIAL 时为您创建的。 (或类似)。该序列将在有或没有提交的情况下递增,并且不依赖于在表中成功插入记录。

请注意,仅涉及 SELECT 的语句不需要调用提交.

关于python - 如何通过调用 Postgres 函数插​​入记录时提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47615152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com